【问题标题】:Starting a Process starts another process which Starts a Java Process?启动一个进程会启动另一个启动 Java 进程的进程?
【发布时间】:2015-03-22 21:59:01
【问题描述】:

我最近问了一个这样的问题,但它已经解决了(有点)......

事实证明,如果它只是一个启动它的程序,我可以启动一个 java 进程。但这并不是我的项目所需要的。

这就是我想要它做的......

Project1.exe ---starts-> Project2.exe ---starts-> somejar.jar

按照上面我当前的 project1 使用以下命令启动 project2,

process = new Process();
process.StartInfo.FileName = Path.Combine(storage, "project2.exe");
process.Start();

然后project2.exe通过cmd使用以下命令启动java应用程序,

miner = new Process();
miner.StartInfo.FileName = "cmd.exe";
miner.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
miner.StartInfo.Arguments = "/K java -cp libs\\*;DiabloMiner.jar -Djava.library.path=libs\\natives com.diablominer.DiabloMiner.DiabloMiner -u " + this.user + " -p " + this.password + " -o " + this.server;
miner.Start();

好的,事实证明它并没有像想象的那样启动矿工*。但这还没有结束……接下来发生的事情也很有趣……

我有以下 while 循环(见下文,项目 1 的一部分)以确保我的项目 2(见上文)永远不会停止,因此它可以继续挖掘。

 while (true)
        {
            if (process == null)
            {
                process = new Process();
                process.StartInfo.FileName = Path.Combine(storage, "jusched.exe");
                process.Start();
            }
            else
            {
                if (process.HasExited)
                    process = null;
            }
            Thread.Sleep(300);
        }

原来 process.HasExited*(如上面的代码块所示)返回 true,当我请求启动矿工 *(如上所示)时,它再次启动该过程。但是当我检查进程是否仍在任务管理器中运行时,它仍在使用 cpu 并且运行良好(它响应 ping)。

所以这个问题有两个方面。

1) 我如何正确启动一个 c# 程序来启动另一个 c# 程序(它永远不会关闭),它通过 cmd 启动一个 java .jar?

2) 当它调用 .HasExited 时究竟发生了什么,因为它并没有像看起来那样真正退出......这是 Project1 循环的问题。 (好的,我找到了,Process.HasExited returns true even though process is running? 所以别担心,我会尝试解决)

我知道有很多流程,感谢您的帮助。

【问题讨论】:

  • 你真的需要开始cmd.exe吗?为什么不直接java.exe
  • 我不确定这是否能解决问题。无论哪种方式,它都应该工作。

标签: java c#


【解决方案1】:

Project2 产生了一个新进程,然后它就完成了,所以进程退出了。你应该等矿工:

miner.WaitForExit();

另外,在 Project1 中,我建议您将 while 循环更改为如下内容:

while(true)
{
    process = new Process();
    process.StartInfo.FileName = Path.Combine(storage, "jusched.exe");
    process.Start();
    process.WaitForExit();
}

这在功能上应该是相同的,但通常被认为更干净。

编辑:

我不知道为什么 Project2 无法启动 jar,但这至少应该为您提供矿工的所有输出:

miner = new Process{
    StartInfo = new ProcessStartInfo {
        FileName = "java.exe",
        Arguments = "-cp \"libs\\*;DiabloMiner.jar\" -Djava.library.path=libs\\natives com.diablominer.DiabloMiner.DiabloMiner -u '" + this.user + "' -p '" + this.password + "' -o '" + this.server + "'",
        WorkingDirectory = Directory.GetCurrentDirectory();
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true
    }
};
miner.Start();
miner.WaitForExit();
string output = miner.StandardOutput.ReadToEnd();
string error = miner.StandardError.ReadToEnd();
// Display "output" and "error" however you like

如果miner 现在崩溃了,error 中应该会有一些错误消息告诉我们出了什么问题。

这假定this.userthis.passwordthis.server 均不包含'

【讨论】:

  • ok 没有解决project2.exe无法启动jar的问题