优雅地终止从带有“start /b”的 Windows 批处理文件启动的 java (jetty/solr) 进程

Posted

技术标签:

【中文标题】优雅地终止从带有“start /b”的 Windows 批处理文件启动的 java (jetty/solr) 进程【英文标题】:Gracefully kill a java (jetty/solr) process started from a windows batch file with "start /b" 【发布时间】:2012-11-17 21:57:34 【问题描述】:

我正在从一个批处理文件中启动一个 Java 后台进程 (Solr)

start /b java -jar ...

问题在于start /b 将屏蔽进程免受 SIGINT 信号的影响,请参阅help start。这意味着taskkill /pid ... 将不起作用,taskkill /f /pid ... 将终止进程,而不让它先执行关闭挂钩。

是否有另一种方法可以在不打开窗口且不屏蔽 SIGINT 的情况下从 .bat 文件启动 Windows 上的后台进程?或者是否有另一种方式向 java VM 发送信号,以便 Solr 在从 start /b 运行时优雅地关闭?

如果可能的话,我想使用普通的批处理脚本而不是 VBScript 或类似的脚本,因为这是我们的大多数用户可能最了解的。

【问题讨论】:

【参考方案1】:

不确定如何在 .bat 文件中执行此操作,但使用 Powershell 您可以执行此操作:

Start-Process java -ArgumentList "-jar start.jar <args>" -WindowStyle Hidden

然后就可以正常停止进程了。

运行 get-help Start-Process -detailed 以获取有关选项的更多信息 - 您还可以轻松地以其他用户身份运行该进程以及旧 start 不允许您执行的其他操作。

【讨论】:

感谢您抽出宝贵时间回答! :-) 不过,我宁愿避免依赖 Powershell,请参阅问题。 谢谢,丹!我没有意识到我的 URL 被截断了。现在应该修好了。赞成您的答案,因为它可能会对其他人有所帮助。【参考方案2】:

你测试过吗?我跑了:

START /B notepad.exe

然后使用关闭它

TASKKILL /PID 123456

【讨论】:

感谢您的回答。是的,这行得通。不幸的是,我描述的情况并非如此。当我使用start java ... 时,taskkill 有效,如果我使用start /b java ...,则不是这样。也许区别在于记事本在我的进程运行时打开一个窗口,并将其输出重定向到日志文件?【参考方案3】:

我为我的特定情况(solr + jetty)找到了解决方法,请参阅http://alaminsumon.blogspot.com.br/2009/06/how-to-stop-and-start-jetty-server-from.html

【讨论】:

以上是关于优雅地终止从带有“start /b”的 Windows 批处理文件启动的 java (jetty/solr) 进程的主要内容,如果未能解决你的问题,请参考以下文章

优雅地终止基于 Boost Asio 的 Windows 控制台应用程序

C memset - 优雅地添加一个空终止符

如何优雅地终止一个线程?

如何用 ProcessPoolExecutor 优雅地终止 loop.run_in_executor?

如何使用 gprof 分析守护进程而不优雅地终止它?

如何优雅地终止正在运行的Spark Streaming程序