如何编写一个bash脚本来在进程死亡时重新启动它?

33 浏览
0 Comments

如何编写一个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

0
0 Comments

问题的原因:用户想要编写一个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需要一点解释,但这个答案非常棒!

0
0 Comments

问题的原因是,用户想要编写一个bash脚本来在进程死亡时重新启动它。

解决方法有两种:

1. 使用monit来处理脚本的启动、停止和重新启动,并在必要时进行健康检查和重新启动。可以访问http://mmonit.com/monit/获取monit。

2. 使用一个简单的脚本来循环执行用户的脚本,如果进程死亡,则重新启动它。代码如下:

while true
do
/your/script
sleep 1
done

monit正是用户需要的解决方法。

0
0 Comments

如何编写一个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。

0