我正在尝试链接一些命令来定期检查/启动两个进程cron
(我在共享主机上,无法更改周围的事物)。经过大量谷歌搜索后,我所做的所有事情都无法正常工作:
尝试在两个 cron 作业中分别启动它们会级联并破坏服务器(可能是因为该grep
命令无法捕获搜索词,因为它们是参数,我不明白):
ps -fu $USER | grep celeryd >/dev/null || $HOME/python27/bin/python $HOME/utilities/manage.py celeryd -E -B --concurrency=1
ps -fu $USER | grep celerycam >/dev/null || $HOME/python27/bin/python $HOME/utilities/manage.py celerycam
在这些其他变体中,我尝试在同一个进程上一起启动进程cron
,仅启动第一个进程:
ps -u $USER | grep python >/dev/null || $HOME/python27/bin/python $HOME/utilities/manage.py celeryd -E -B --concurrency=1 & $HOME/python27/bin/python $HOME/utilities/manage.py celerycam &
ps -u $USER | grep python >/dev/null || ( $HOME/python27/bin/python $HOME/utilities/manage.py celeryd -E -B --concurrency=1 & $HOME/python27/bin/python $HOME/utilities/manage.py celerycam; )
ps -u $USER | grep python >/dev/null || ( $HOME/python27/bin/python $HOME/utilities/manage.py celeryd -E -B --concurrency=1; ) sleep 30s; ( $HOME/python27/bin/python $HOME/utilities/manage.py celerycam; )
我放弃了尝试使用 grep 并利用了;--pidfile
的选项。不允许多个实例,因此我不需要任何实例来检查它:celery worker
celerycam
grep
$HOME/python27/bin/python $HOME/utilities/manage.py celery worker -E -B --concurrency=1 --pidfile=worker.pid
$HOME/python27/bin/python $HOME/utilities/manage.py celerycam
答案1
$USER
大多数 cron 中没有设置。幸运的是,ps -u
如果没有用户名,则默认为当前用户(即运行 cron 的用户)。然而你的 grep 有相当高的机会匹配 grep本身以及芹菜加工过程。您可以通过偷偷摸摸地解决这个问题grep '[c]elery'
。这将匹配名称/参数仅包含 celery 的进程(而不是包含参数 [c]elery 的 grep)。我看到的另一个问题是,因为您运行程序时使用了一个巨大的 management.py 路径,所以您可能会在输出中丢失“celery”部分ps
。这可以通过使用该标志向 ps 的输出添加更多详细信息来解决-w
(它们越多,它就会变得越详细)。所以建议的修复是:
ps fwwwu | grep '[c]eleryd' >/dev/null || $HOME/python27/bin/python $HOME/utilities/manage.py celeryd -E -B --concurrency=1
ps fwwwu | grep '[c]elerycam' >/dev/null || $HOME/python27/bin/python $HOME/utilities/manage.py celerycam
编辑:从上面的 ps 参数中删除了无关的破折号,并pgrep
作为可行的替代方案添加。
或者,您也可以使用另外两个命令pidof
来pgrep
获取正在运行的进程的进程 ID。我认为在这种情况下(如果您的用户名是fred)您可以将命令替换ps
为:
pgrep -fu fred celeryd
以获得类似的结果。
编辑2:在 '[c]elery' 周围添加单引号以停止 shell 通配(运行 cron 的目录(用户 $HOME)可能包含一个名为 celery.txt 的文件)。