每天在屏幕上自动重启命令行进程

每天在屏幕上自动重启命令行进程

我有一个队列脚本,每秒从数据库中查找新作业并处理它们。有时它 10 个小时不做任何事情,有时它在 3 分钟内收到 1000 个新作业。队列大部分情况下运行良好。

但是它需要重新启动。(我不太清楚为什么。我认为作业与之通信的其他服务不喜欢长时间打开连接。重新启动队列会重置所有连接。也许这不是原因。)有时队列脚本会死机。可能是内存错误,我无法确定原因。

有两种重启方式我都可以接受(但必须是自动的):

  1. 每 24 小时明确重启一次:ctrl C+./queue.sh
  2. 等到它死掉,然后重新启动

我也不确定...队列以某种方式运行,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

怎么运行的:

  1. 监控脚本./queue.sh在后台运行一个进程(第 3 行),并运行一个休眠一天后终止的子进程./queue.sh(第 4 行)。然后,它等待./queue.sh完成(第 5 行)。

  2. 如果./queue.sh提前结束,监视器将终止该sleep进程(第 6 行),因此以后它不会再终止具有相同 PID 的无辜进程。wait第 7 行的命令可防止该sleep进程成为僵尸进程。

  3. 如果./queue.sh执行持续超过 24 小时,则在sleep进程结束时强制完成(第 4 行)。

答案2

queue.sh必须运行某种进程。您可以修改它,使其循环 - 如下所示(不一定是有效的 bash,只是一些伪代码):

  do
      processqueue
  loop

然后编写一个 cronjob,processqueue在凌晨 1 点或您喜欢的任何时间终止进程。进程将终止,然后循环将重新启动它。

相关内容