通过ID获取后写入处理'标准输入

时间:2015-09-02 14:09:48

标签: .net process msbuild kill-process

我需要在MSBuild任务期间运行一个进程,并在执行其他操作后正常关闭该进程。我不能使用kill,因为它只是粗暴地终止了这个过程,并使一些事情处于不良状态。

有问题的过程是RavenDB,它通过在标准输入中输入q来支持退出。这就是MSBuild任务的样子(缩短):

“RavenDBQuit”

<UsingTask TaskName="RavenDBQuit"
           ...
    <ParameterGroup>
        <ProcessId Required="true" ParameterType="System.Int32" />
    </ParameterGroup>

    <Task>
        <Using Namespace="System.Diagnostics" />
        <Code Type="Fragment" Language="cs">
        <![CDATA[
        var process = Process.GetProcessById(this.ProcessId);
        process.StandardInput.WriteLine("q");
        ]]>
        </Code>  
    </Task>
</UsingTask>

“RavenDBStart

<UsingTask TaskName="RavenDBStart"
    <ParameterGroup>   
        ...
        <ProcessId ParameterType="System.Int32" Output="true" />
    </ParameterGroup>

    <Task>
        <Using Namespace="System.Diagnostics" />
        <Code Type="Fragment" Language="cs">
        <![CDATA[
        var process = new Process
        {
            StartInfo =
            {
                FileName = this.FileName,
                WorkingDirectory = this.WorkingDirectory,
                Arguments = this.Arguments,
                UseShellExecute = false,                    
                CreateNoWindow = true,
                RedirectStandardInput = true
            }
        };

        process.Start();

        this.ProcessId = process.Id;
        ]]>
        </Code>  
    </Task>
</UsingTask>

我收到错误:

  

system.InvalidOperationException:未重定向StandardIn。

在按ID检索后,您似乎无法写入Process的标准输入,您将需要使用相同的对象。

我可以做点别的吗?我尝试在任务之间直接传递process对象但不支持。

我的最后一招是在等待一段时间之后使用kill,希望RavenDB已经完成了当时所需的一切。

0 个答案:

没有答案