如何使用 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
我首先用 ps
和 grep -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.
进行管理
一个简单且 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,我也会推荐:
检查 cronjob 的日志以了解其他问题
grep CRON /var/log/syslog
使用独立的 bash 脚本清理它(不要忘记 chmod +x)
我的任务是 运行 生产服务器后台的守护进程。但是,我确实想确保这个守护进程总是 运行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
我首先用 ps
和 grep -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.
一个简单且 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,我也会推荐:
检查 cronjob 的日志以了解其他问题
grep CRON /var/log/syslog
使用独立的 bash 脚本清理它(不要忘记 chmod +x)