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

时间:2018-03-02 10:27:32

标签: php cron background-process daemon akeneo

我的任务是在生产服务器上的后台运行一个守护进程。但是,我确实希望确保此守护程序始终运行。守护进程是PHP进程。

我尝试通过检查守护程序是否正在运行来解决此问题,如果没有:启动它。所以我有一个命令:

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

我首先使用ifps执行grep -c以检查是否存在使用给定名称运行的进程,如果没有:我以{{1}结束命令迫使它开始。

上面的命令有效,如果我从命令行执行它,进程就会启动,当我执行一个简单的&命令时,我可以看到它正在运行。

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

ps ax

我还在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 - 标题,但我也没有收到任何电子邮件。

有谁能告诉我我的方法有什么问题?我怎么能开始呢?

4 个答案:

答案 0 :(得分:2)

简单和旧式的是创建一个bash文件,您基本上可以检查进程是否正在运行,否则启动它。

这里是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文件。

答案 1 :(得分:1)

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

  

Supervisor是一个客户端/服务器系统,允许其用户在类UNIX操作系统上监视和控制许多进程。

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

进行管理

答案 2 :(得分:0)

一个在命令行上工作而不在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

答案 3 :(得分:0)

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

否则,如果你想使用cronjobs来做,你可能有php二进制问题,你需要设置绝对路径:

e.g : /usr/bin/php

如果您使用cronjob我也会建议:

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

    grep CRON / var / log / syslog

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