如何使用 cron 检查后台程序是否 运行,并在需要时启动它?

How can I check if a program is running in the background using a cron, and start it if needed?

我的任务是 运行 生产服务器后台的守护进程。但是,我确实想确保这个守护进程总是 运行s。守护进程是 PHP 进程。

我试图通过检查守护进程是否 运行ning 来解决这个问题,如果不是:启动它。所以我有这样的命令:

if [ $(ps ax | grep -c "akeneo:batch:job-queue-consumer-daemon") -lt 3 ]; then php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon & fi

我首先用 psgrep -c 做一个 if 来检查是否有进程 运行 一个给定的名字,如果没有:我开始命令结束使用 &,强制启动。

上面的命令有效,如果我从命令行执行它,进程就会启动,当我执行一个简单的 ps ax-command 时,我可以看到它是 运行ning。

但是,一旦我尝试使用 crontab 执行此操作,它就无法启动:

* * * * * if [ $(ps ax | grep -c "akeneo:batch:job-queue-consumer-daemon") -lt 3 ]; then php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon & fi

我还在 crontab 中设置了 MAILTO-header,但我也没有收到任何电子邮件。

谁能告诉我我的方法有什么问题吗?我该如何开始?

一个在命令行上运行但在 CRON 上不起作用的命令,这发生在我身上,这就是解决我问题的方法。

运行 echo $PATH 在您的终端中,复制整个输出。

然后键入 crontab -e 并在文件顶部写入此

PATH=WHATEVER_YOU_COPIED_FROM_LAST_COMMAND_OUTPUT

PS:(更多建议)

我认为您需要在 Ubuntu 上安装 apt-get install postfix 才能发送电子邮件。

您还应该通过

查看 CRON 日志
grep CRON /var/log/syslog

有针对此类任务的特殊服务。例如http://supervisord.org/

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.

您可以通过 f.e https://github.com/supervisorphp/supervisor

进行管理

一个简单且 old-style 的方法是创建一个 bash 文件,您基本上可以在其中检查进程是否 运行ning,否则就启动它。

这里是 bash 文件的内容:

#!/bin/bash

if [ $(ps -efa | grep -v grep | grep job-queue-consumer-daemon -c) -gt 0 ] ;
then
    echo "Process running ...";
else
    php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon
fi;

然后在 crontab 文件中 运行 bash 文件。

我建议您使用 supervisord,它通过在失败的服务上自动重启来处理此类问题,此外,您可以尝试将 akeneo 命令设置为服务。

否则,如果您想使用 cronjobs 来完成,您可能会遇到 php 二进制文件的问题,您需要设置绝对路径:

e.g : /usr/bin/php

如果你使用 cronjob,我也会推荐:

  1. 检查 cronjob 的日志以了解其他问题

    grep CRON /var/log/syslog

  2. 使用独立的 bash 脚本清理它(不要忘记 chmod +x)