优雅地终止从带有“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 控制台应用程序