首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >终止bash进程不会终止bash当前正在运行的进程

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

Stack Overflow用户
提问于 2012-06-19 01:11:43
回答 3查看 1.9K关注 0票数 0

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

代码语言:javascript
复制
/bin/bash -c "while true; do java ...; done" &

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

由于我不想管理2个PID(一个用于后台bash,另一个用于当前运行的JVM),有没有一种“强制终止”的方法可以停止当前的命令?(我在人类杀手中找不到这样的东西)?

EN

回答 3

Stack Overflow用户

发布于 2012-06-19 01:25:49

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

所有这些都将在关机时立即自动重启,跟踪所需状态而不是当前状态(并尝试根据需要发出启动或关机信号),管理信号传递等。

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

ProcessManagement page of the wooledge.org wiki (由irc.freenode.org的#bash频道使用)有其他一些具体的建议,可以在bash中自己做这件事……尽管它也建议将runit、daemontools和它们的同类作为最佳实践方法。

票数 3
EN

Stack Overflow用户

发布于 2012-06-19 01:14:25

为什么不使用cron来启动你的应用,并且只管理属于你的应用的1个pid呢?这样的话,你将永远杀死正确的进程。

强调一点,你可以创建一个bash脚本来管理你的应用: start|stop|status。在启动时,它会将java pid保存到一个文件中。然后,您可以安排一个cron作业来验证应用程序的状态,如果pid不存在,则重新启动它。

票数 0
EN

Stack Overflow用户

发布于 2012-06-19 03:05:22

这不是bash的默认行为吗?我想,例如zsh做了相反的事情,并且不向所有子进程发送SIGHUP?也许你可以试一下这个答案,写一个小脚本,然后以disown开头?

请看这个问题:Tie the life of a process to the shell that started it

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11087722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档