Cronjob命令为1个python脚本启动2个进程

时间:2014-07-28 05:53:44

标签: bash cron crontab kill-process

我的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

  • 为什么要显示2个流程? 并且killall命令也常常工作正常。

我对我的脚本进行了更改,为了获得新的行为,我不得不杀死当前正在运行的脚本并使用了

  

杀死13898 13900

之后我使用了相同的命令(如在crontab中)

  

/home/MY_SCRIPT.py / home / arguments 2>的/ dev / null的

  • 但是现在重新启动脚本后,它只显示了一个进程(这很有意义)

到目前为止,一切看起来都不错,但是这次cronjob中的killall MY_SCRIPT没有用,它说找不到pid。并且脚本一直在运行,直到我不得不手动杀死它。

需要找出这种行为的原因:

  1. 为什么来自cronjob的2个进程
  2. 我重新编写脚本的方式是否有问题
  3. 如何确保下次重新启动脚本时,cron应该确定
  4. 操作系统:Linux Ubuntu

1 个答案:

答案 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"'