ps crontab 里面没有看到正在运行的进程

ps crontab 里面没有看到正在运行的进程

我有这个机器人worker.py,我只是以如下方式运行它:

python worker.py --details

这个机器人存在很多问题,所以它每隔30分钟就会停机一次。

当机器人运行时,ps aux | grep worker.py给我输出:

root      3870  6.2 11.7 997960 59052 pts/0    Sl   10:47   0:32 python worker.py --details
root      4030  0.0  0.4   9752  2312 pts/0    S+   10:55   0:00 grep --color=auto worker

因此,我使用以下命令将 cron 设置为每 10 分钟运行一次:

cd /path/to/boot && if [ 2 -gt `ps aux | grep worker.py | wc -l` ]; then python worker.py --detail &> /dev/null ; fi

问题是:

  • 如果我直接在命令行中运行上述命令,它可以正常工作(如果机器人正在运行,则什么也不会发生,如果机器人倒下,它会再次启动)。
  • 当 cron 运行命令时,它会每 10 分钟创建一个新进程(这会给我的数据库带来麻烦),因为我猜测它没有看到当前进程。*

以上所有内容均以 root 身份进行,因此,我猜测这与用户问题无关。

谢谢

答案1

您需要一个锁定文件并检查此锁定文件。如果存在,则结束脚本,否则启动它。

示例命令如下劣质品

描述

Shlock 尝试创建一个名为 name 的锁定文件并将进程 ID pid 写入其中。如果该文件已存在,shlock 将从文件中读取进程 ID 并测试该进程是否正在运行。如果该进程存在,则不会创建该文件。如果 Shlock 能够创建锁定文件,则以零状态退出;如果该文件引用当前活动的进程,则以非零状态退出。

答案2

cron 无法使用 ps aux 找到该进程,ps COLUMNS 默认值为 80。即 ps 命令输出被截断为 80 COLUMNS。

ps -aef before column set:
admin    28695     1  0 08:37 ?        00:00:00 /usr/bin/python /home/admin/MyP

ps -aef after column set:
admin    28695     1  0 08:37 ?        00:00:00 /usr/bin/python /home/admin/MyPython/test.py

像下面这样将列添加到 crontab 中,它将解决问题。

crontab 如下:

SHELL=/bin/bash
COLUMNS=160
37 08 * * * /home/admin/MyPython/test.py >>  /home/admin/MyPhon/test.py.log 2>&1 &

test.py 包含以下内容:

cmd1="ps -aef >> /home/admin/MyPython/test_ps.txt; echo COLUMNS: ${COLUMNS} ${Shell}>> /home/admin/MyPython/test_ps.txt;"
print cmd1
os.system(cmd1)

希望它能解答。

相关内容