Crontab没有重启进程

时间:2015-01-05 14:42:54

标签: python cron crontab

我正在尝试设置一个crontab来运行6个python数据抓取工具。我厌倦了当其中一个失败时必须手动重启它们。运行以下内容时:

>  ps -ef | grep python
ubuntu   31537     1  0 13:09 ?  00:00:03 python /home/ubuntu/scrapers/datascraper1.py

等...我在同一文件夹中得到了数据堆栈1-6的列表。

我像这样编辑了我的crontab:

  

sudo crontab -e

# m h  dom mon dow   command
* * * * * pgrep -f /home/ubuntu/scrapers/datascraper1.py || python /home/ubuntu/scrapers/datascraper1.py > test.out

然后我点击control + X退出并点击yes保存为/tmp/crontab.M6sSxL/crontab。 但是,无论是手动终止进程还是进程自身失败,它都无法重启甚至启动datascraper1.py。接下来,我尝试重新加载cron但它仍然没有工作:

sudo cron reload

最后,我尝试从cron语句中删除nohup,但也没有用。 如何检查cron.allow或cron.deny文件是否存在? 另外,我需要在pgrep之前添加用户名吗?我也不确定"> test.out"正在cron声明的最后做。

运行后

grep CRON /var/log/syslog 

检查cron是否完全运行,我得到了这个输出:

ubuntu@ip-172-31-29-12:~$ grep CRON /var/log/syslog
Jan  5 07:01:01 ip-172-31-29-12 CRON[31101]: (root) CMD (pgrep -f datascraper1.py ||       
python /home/ubuntu/scrapers/datascraper1.py > test.out)
Jan  5 07:01:01 ip-172-31-29-12 CRON[31100]: (CRON) info (No MTA installed, discarding output)
Jan  5 07:17:01 ip-172-31-29-12 CRON[31115]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan  5 08:01:01 ip-172-31-29-12 CRON[31140]: (root) CMD (pgrep -f datascraper1.py || python /home/ubuntu/scrapers/datascraper1.py > test.out)

由于有证据表明Cron正在执行该命令,因此该命令一定有问题,(注意:我添加了python的路径):

pgrep -f datascraper1.py || /usr/bin/python /home/ubuntu/scrapers/datascraper1.py > test.out

应检查datascaper1.py是否正在运行,如果没有,则重新启动它。

因为Cron实际上是在执行这个陈述:

(root) CMD (pgrep -f datascraper1.py || python /home/ubuntu/scrapers/datascraper1.py > test.out)

又名

root pgrep -f datascraper1.py

运行上面的root命令会给我:

The program 'root' is currently not installed. You can install it by typing:
sudo apt-get install root-system-bin

Cron从root运行命令有问题吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

首先,您需要了解cron是否正常工作。 将其添加到您的cron文件中(理想情况下,暂时删除python语句,以获得清除状态)

* * * * * echo `date` >>/home/your_username/hello_cron

这将在文件" hello_cron"中输出日期。每一分钟。试试这个,如果这样做,即你每分钟都看到输出,请写在这里,我们可以进一步排除故障。

您还可以查看系统日志以查看cron是否已运行您的命令,如下所示:

grep CRON /var/log/syslog

请问> test.out部分会将python程序的输出重定向到文件test.out。我不确定为什么你需要nohup部分 - 即使你已经退出,这也会让python程序运行 - 这就是你想要的吗?

编辑:对cron进行故障排除后:

关于没有安装MTA的消息意味着cron正在尝试向您发送包含作业输出的电子邮件,但由于您没有安装电子邮件程序,因此无法发送电子邮件:

也许这会解决它:     sudo apt-get install postfix

在cron中调用python程序的行正在产生一些输出(错误),所以它最符合您的利益,看看会发生什么。请查看本教程,了解如何设置电子邮件地址:http://www.cyberciti.biz/faq/linux-unix-crontab-change-mailto-settings/

以防教程不可用:

MAILTO:youremail@example.com

答案 1 :(得分:0)

您需要在作业开始时将python home添加到路径中,但是您已经设置了python。当你自己运行它并键入python时,它会检查你的位置,然后是一级,然后是你的$ PATH。所以,python home(python二进制文件所在的位置)需要为拥有cron的用户全局导出(所以,将它放在/etc/rc.d/中的rc脚本中)或者,你需要将python挂载到home在cron工作开始时的路径。所以,

 export PATH=$PATH:<path to python>

或者,将cron条目写为

 /usr/bin/python /home/ubuntu/etc/etc

直接调用它。它可能不是/ usr / bin,运行命令

'which python'

找出答案。

没有MTA&#39;消息意味着您正在收到STDERR,它通常会邮寄给用户,但不能因为您没有设置邮件传输代理,例如mailx或mutt,因此用户无法从cron发送邮件,所以它被丢弃了。如果您还希望STDERR进入日志,最后也不是

 "command" > test.out

 "command" 2>&1 > test.out

将STDERR重定向到STDOUT,然后将两者重定向到test.out。