我有这个机器人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)
希望它能解答。