我有一个队列脚本,每秒从数据库中查找新作业并处理它们。有时它 10 个小时不做任何事情,有时它在 3 分钟内收到 1000 个新作业。队列大部分情况下运行良好。
但是它需要重新启动。(我不太清楚为什么。我认为作业与之通信的其他服务不喜欢长时间打开连接。重新启动队列会重置所有连接。也许这不是原因。)有时队列脚本会死机。可能是内存错误,我无法确定原因。
有两种重启方式我都可以接受(但必须是自动的):
- 每 24 小时明确重启一次:
ctrl C
+./queue.sh
- 等到它死掉,然后重新启动
我也不确定...队列以某种方式运行,screen
因此我可以随时跟踪输出。一个命令如何监听另一个命令的完成并重新启动它,而无需成为守护进程?
我什么都安装不了。这是个糟糕的 Redhat 服务器,我没有合适的管理员权限。
我曾考虑过创建一个每 24 小时触发一次并在 24 小时后自行终止的 cronjob,但这听起来很不对...我无法将 cronjob 用于队列,因为新作业必须几乎立即执行。
答案1
您可以./queue.sh
作为监视脚本的子脚本运行,如下所示:
1. #!/bin/bash
2. while true; do
3. ./queue.sh & q_pid="${!}"
4. ( sleep 86400 ; kill "${q_pid}" ) & s_pid="${!}"
5. wait "${q_pid}"
6. kill "${s_pid}"
7. wait "${s_pid}"
8. done
怎么运行的:
监控脚本
./queue.sh
在后台运行一个进程(第 3 行),并运行一个休眠一天后终止的子进程./queue.sh
(第 4 行)。然后,它等待./queue.sh
完成(第 5 行)。如果
./queue.sh
提前结束,监视器将终止该sleep
进程(第 6 行),因此以后它不会再终止具有相同 PID 的无辜进程。wait
第 7 行的命令可防止该sleep
进程成为僵尸进程。如果
./queue.sh
执行持续超过 24 小时,则在sleep
进程结束时强制完成(第 4 行)。
答案2
queue.sh
必须运行某种进程。您可以修改它,使其循环 - 如下所示(不一定是有效的 bash,只是一些伪代码):
do
processqueue
loop
然后编写一个 cronjob,processqueue
在凌晨 1 点或您喜欢的任何时间终止进程。进程将终止,然后循环将重新启动它。