Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 终止bash进程不会终止bash当前正在运行的进程_Java_Shell_Jvm - Fatal编程技术网

Java 终止bash进程不会终止bash当前正在运行的进程

Java 终止bash进程不会终止bash当前正在运行的进程,java,shell,jvm,Java,Shell,Jvm,场景如下:我有一个java守护进程,它应该不会终止。但是,如果出现意外错误,崩溃的JVM应该通过脚本重新启动。因此,我编写了一个命令,该命令启动一个后台bash,该bash有一个启动JVM的循环(因此,当JVM终止时,它将再次重新启动) 为了能够停止守护进程,我想杀死这个bash后台进程(通过将其进程id保存在文件中)。只要后台bash不重新启动JVM,但仍然不会终止当前正在运行的进程,那么它就可以工作——因此bash似乎会在检查kill命令之前结束当前的命令。我希望当前运行的JVM也被杀死 既

场景如下:我有一个java守护进程,它应该不会终止。但是,如果出现意外错误,崩溃的JVM应该通过脚本重新启动。因此,我编写了一个命令,该命令启动一个后台bash,该bash有一个启动JVM的循环(因此,当JVM终止时,它将再次重新启动)

为了能够停止守护进程,我想杀死这个bash后台进程(通过将其进程id保存在文件中)。只要后台bash不重新启动JVM,但仍然不会终止当前正在运行的进程,那么它就可以工作——因此bash似乎会在检查kill命令之前结束当前的命令。我希望当前运行的JVM也被杀死

既然我不想管理2个PID(一个用于后台bash,另一个用于当前运行的JVM),那么有没有一种“强制杀死”的方法,通过设计停止当前命令?(我在man kill中找不到这样的东西)?

为什么不使用启动你的应用程序,只管理一个属于你的应用程序的pid?这样,您将始终终止正确的进程

需要强调的是,您可以创建一个bash脚本来管理您的应用程序:开始|停止|状态。启动时,它会将java pid保存到一个文件中。然后,您可以安排一个cron作业来验证应用程序的状态,如果该pid不存在,请重新启动它。

为什么不使用启动您的应用程序,并只管理一个属于您的应用程序的pid?这样,您将始终终止正确的进程


需要强调的是,您可以创建一个bash脚本来管理您的应用程序:开始|停止|状态。启动时,它会将java pid保存到一个文件中。然后,您可以安排一个cron作业来验证应用程序的状态,如果pid不存在,请重新启动它。

有许多流程管理工具正是为此目的而构建的:runit、daemontools、upstart。。。甚至是SysV inittab表中的一个条目

所有这些都将在停机时立即自动重新启动,跟踪与当前状态相反的所需状态(并尝试根据需要发出启动或停机信号),管理信号传递等

您可以在bash中捕获信号并触发其上的事件,但这只处理可以捕获的子集(例如,您不能捕获KILL)。更好的方法是使用一个专门设计的工具



(由irc.freenode.org的#bash频道使用)还有一些关于自己在bash中这样做的具体建议。。。尽管它也建议将runit、daemontools及其同类作为最佳实践方法。

有许多流程管理工具正是为此目的而构建的:runit、daemontools、upstart。。。甚至是SysV inittab表中的一个条目

所有这些都将在停机时立即自动重新启动,跟踪与当前状态相反的所需状态(并尝试根据需要发出启动或停机信号),管理信号传递等

您可以在bash中捕获信号并触发其上的事件,但这只处理可以捕获的子集(例如,您不能捕获KILL)。更好的方法是使用一个专门设计的工具



(由irc.freenode.org的#bash频道使用)还有一些关于自己在bash中这样做的具体建议。。。尽管它也建议使用runit、daemontools及其同类作为最佳实践方法。

这不是bash的默认行为吗?例如,我认为zsh做的正好相反,不向所有子进程发送SIGHUP?也许你可以试试这个答案,写一个小脚本,然后以否认开始

见这个问题:


我没有测试它,但我需要在我的Web服务器中使用zsh,因为我手动启动它,然后使用双CTRL-D退出shell。

这不是bash的默认行为吗?例如,我认为zsh做的正好相反,不向所有子进程发送SIGHUP?也许你可以试试这个答案,写一个小脚本,然后以否认开始

见这个问题:


我没有测试它,但我需要在我的Web服务器中使用zsh,因为我手动启动它,然后使用双CTRL-D退出shell。

什么是主机操作系统?linux?你对系统有管理员权限吗?它是Linux。我以具有sudo权限的用户身份执行。可能就是你要找的。什么是主机操作系统?linux?你对系统有管理员权限吗?它是Linux。我以具有sudo权限的用户身份执行。可能就是你要找的。如果他已经安装了其他工具,或者他有特权,我很感激你的详尽回答。我担心这个解决方案对我的情况来说太重了(依赖那些工具)。@David如果是这样的话,我建议阅读链接的wiki页面。(也就是说,您可能已经可以使用这些工具了——例如,Upstart是现代Debian、Ubuntu和Fedora中默认的init工具)。+1对于其他工具,考虑到他已经安装了这些工具或拥有特权,我非常感谢您的详细回答。我担心这个解决方案对我的情况来说太重了(依赖那些工具)。@David如果是这样的话,我建议阅读链接的wiki页面。(也就是说,您可能已经可以使用这些工具了——例如,Upstart是现代Debian、Ubuntu和Fedora中的默认init工具)。除非小心处理(在所有读取或更新操作期间使用flock或类似工具锁定),否则PID文件往往会有争用条件,并且容易发生冲突(可以重用PID表条目)。大多数情况下,它们都可以工作,但不一定是最佳实践。我同意,但由于生产环境的限制和简单性,这是我使用最多的解决方案。这也是为什么您得到了+1:)除非小心处理(在所有读取或更新操作期间使用flock或类似工具锁定),否则PID文件往往具有竞争条件,并且容易发生冲突(可以重用PID表条目)。它们大多有效,但不一定是最佳实践。同意,
/bin/bash -c "while true; do java ...; done" &