我的crontab有命令:
50 08 * * 1-5 /home/MY_SCRIPT.py / home / arguments 2>的/ dev / null的
59 23 * * 1-5 killall MY_SCRIPT.py
哪个工作得很好,但是我以前做过
ps aux | grep SCRIPT
显示:
myuser 13898 0.0 0.0 4444 648? Ss 08:50 0:00 / bin / sh -c /home/MY_SCRIPT.py / home / arguments 2>的/ dev / null的
myuser 13900 0.0 0.0 25268 7384? S 08:50 0:00 / usr / bin / python /home/MY_SCRIPT.py / home / arguments
我对我的脚本进行了更改,为了获得新的行为,我不得不杀死当前正在运行的脚本并使用了
杀死13898 13900
之后我使用了相同的命令(如在crontab中)
/home/MY_SCRIPT.py / home / arguments 2>的/ dev / null的
到目前为止,一切看起来都不错,但是这次cronjob中的killall MY_SCRIPT没有用,它说找不到pid。并且脚本一直在运行,直到我不得不手动杀死它。
需要找出这种行为的原因:
操作系统:Linux Ubuntu
答案 0 :(得分:2)
您正在查看两个进程,因为crontab使用/bin/sh
来召唤您的python脚本。所以基本上会发生什么:
/bin/sh -c '/home/MY_SCRIPT.py /home/arguments 2> /dev/null'
流程结构变为
/bin/sh -> /usr/bin/python
请尝试使用此格式:
50 08 * * 1-5 /bin/sh -c 'exec /home/MY_SCRIPT.py /home/arguments 2> /dev/null'
指定killall
的完整路径也是一个好主意。它可能在/usr/bin
。使用which killall
进行验证。
59 23 * * 1-5 /usr/bin/killall MY_SCRIPT.py
另一种更有效的方法是在某处保存您的进程ID:
50 08 * * 1-5 /bin/sh -c 'echo "$$" > /var/run/my_script.pid; exec /home/MY_SCRIPT.py /home/arguments 2> /dev/null'
使用效率更高的杀手:
59 23 * * 1-5 /bin/sh -c 'read PID < /var/run/my_script.pid; kill "$PID"'