我正在尝试设置一个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运行命令有问题吗?
感谢您的帮助。
答案 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条目写为 p>
/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。