【问题标题】:Gracefuly stop .net initiated Java Process优雅地停止 .net 启动的 Java 进程
【发布时间】:2009-10-01 20:57:07
【问题描述】:

有了下一个 .net 代码,我想正确停止它,以便 jvm 执行它的 ShutdownHooks。

System.Diagnostics.Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.WorkingDirectory = @"C:\test\";
p.StartInfo.FileName = @"C:\Program Files\Java\jre6u16\bin\java.exe";
p.StartInfo.Arguments = "-jar TheExecutable.jar";

尝试使用 p.Kill() 停止进程将强制 jvm 停止而不发送在 unix kill 命令中找到的等效 SIGTERM。或者 maeby 我做错了什么,因为 java 进程没有执行它的关闭挂钩。

谢谢!

【问题讨论】:

    标签: c# java .net windows-services process


    【解决方案1】:

    如果您可以控制 Java 代码,则可以检测到相当正常的情况,例如 stdin 中的文件结束,或 stdin 中的所谓毒丸,并使用它来决定(在 Java ) 现在是时候退出了。

    然后杀死java进程,对其stdin做任何需要的事情。

    另一种选择是编写信号处理程序 - see sun.misc.SignalHandler,并将其注册到 sum.misc.Signal

    其他选项似乎相当可怕 - 例如轮询父进程或查看文件。

    【讨论】:

    • 非常有用的答案。非常感谢!
    • 顺便问一下,请您解释一下为什么在这种特定情况下在 Windows 中我们不能在 linux 中执行发送 SIGTERM 的工作吗?
    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 2011-03-12
    • 2019-11-10
    • 2020-04-07
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多