如何编写一个bash脚本来在进程死亡时重新启动它?
如何编写一个bash脚本来在进程死亡时重新启动它?
我有一个Python脚本,它将检查一个队列并对每个项目执行操作:\n
# checkqueue.py while True: check_queue() do_something()
\n我该如何编写一个bash脚本来检查它是否正在运行,如果没有,则启动它。大致的伪代码如下(或者也许它应该像ps | grep
那样做一些事情?):\n
# keepalivescript.sh 如果进程ID文件存在: 如果进程ID正在运行: 退出,一切正常 运行checkqueue.py 将进程ID写入进程ID文件
\n我将从crontab调用它:\n
# crontab */5 * * * * /path/to/keepalivescript.sh
问题的原因:用户想要编写一个bash脚本来在进程死亡时重新启动它。
解决方法:可以使用以下方法来实现:
方法一:使用一个while循环来检测进程是否死亡,如果进程死亡,则重新启动它。如果进程正常退出(返回代码为0),则使用&& break
来停止循环。
方法二:使用一个while循环来检测进程是否死亡,如果进程死亡,则重新启动它。不管进程如何退出,都会重新启动。
下面是一个例子,展示了如何使用这些方法:
例子1:
while true; do openconnect x.x.x.x:xxxx && break; done
例子2:
while true; do docker logs -f container-name; sleep 2; done
这是我最喜欢的答案,内联的方法非常好用,没有额外的软件依赖。如果想要将其变成一个命令,可以称之为"jafari"。下面是我用它的例子:
while true; do ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :10.0 -f mpegts srt://:6666?mode=listener && break; done
使用break
需要一点解释,但这个答案非常棒!
问题的原因是,用户想要编写一个bash脚本来在进程死亡时重新启动它。
解决方法有两种:
1. 使用monit来处理脚本的启动、停止和重新启动,并在必要时进行健康检查和重新启动。可以访问http://mmonit.com/monit/获取monit。
2. 使用一个简单的脚本来循环执行用户的脚本,如果进程死亡,则重新启动它。代码如下:
while true do /your/script sleep 1 done
monit正是用户需要的解决方法。
如何编写一个bash脚本来在进程死亡时重新启动它?
避免使用PID文件、cron或任何其他试图评估非其子进程的进程。在UNIX中,你只能等待子进程,任何试图规避这一点的方法(如ps解析、pgrep、存储PID等)都是有缺陷的。相反,你需要监控你的进程的进程成为它的父进程。
为了解决这个问题,可以使用以下bash代码:
until myserver; do echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2 sleep 1 done
上述代码中的until循环运行myserver。第一行启动myserver并等待其结束。当它结束时,until检查其退出状态。如果退出状态为0,则表示它正常结束(这意味着你要求它关闭,并且它成功关闭了)。在这种情况下,我们不希望重新启动它。如果退出状态不为0,则until将运行循环体,该循环体在标准错误输出中发出错误消息,并在1秒后重新启动循环。
为什么要等待一秒?因为如果myserver的启动顺序有问题,它会立即崩溃,你将面临不断重新启动和崩溃的密集循环。睡眠1秒可以减轻这种压力。
现在,你只需要启动这个bash脚本(可能是异步的),它将监控myserver并根据需要重新启动它。如果要在启动时启动这个监视器(使服务器在重启后“存活”),可以使用用户的cron规则来安排它。
另一种方法是查看inittab和/etc/inittab。你可以在其中添加一行,让myserver在特定的init级别启动,并自动重新启动。
除了上述方法外,还有一些其他监控进程的好系统可供选择,比如runit。