记一次由于环境变量引起的crontab执行没有日志输出的问题

今天在scrapy的代码中加入监测环境变量来动态配置setting的代码,但代码部署后发现以前正常的crontab 任务没有任何日志输出 了。手动命令行执行却是可以执行的。查看/var/message/cron发现脚本是执行的,但无法确认是否执行成功。

于是把crontab的任务改了一下 把 

*/20 * * * * /usr/bin/sh /home/hjdang/scrapy_cron.sh 改成了  */1 * * * * /usr/bin/sh /home/hjdang/scrapy_cron.sh > cron.log

结果郁闷的是在目录下没发现cron.log

。。。。

一开始还以为是crontab的执行出问题了,各种crond重启,网上搜,还是不行

后来终于发现原来是语句写的有问题,*/1 * * * * /usr/bin/sh /home/hjdang/scrapy_cron.sh > cron.log 这个会把文件输出到执行用户(root)的根目录下,而我原本是想在/home/hjdang/下面的(粗心了,改成*/1 * * * * /usr/bin/sh /home/hjdang/scrapy_cron.sh > /home/hjdang/cron.log)就有了。

但是脚本执行了,scrapy的日志啥的都没有啊,而且为了调试,我把

nohup scrapy crawl smzdm_jingxuan  

改成了

nohup scrapy crawl smzdm_jingxuan & >> smzdm.log 10>&1 &

但smzdm.log总是空文件。

后来又发现这个语句也写的有问题,真是郁闷。改成下面终于看到输出了.

nohup scrapy crawl smzdm_jingxuan  >> smzdm.log 10>&1 

日志上报错了

FileNotFoundError: [Errno 2] No such file or directory: '/Users/gaoxianghu/temp/scraping.log'

明显是配置文件的路径找不到,但我明明用环境变量区分了啊,一顿搜索,终于发现了原因。有网友说:因为在Linux下用crontab执行定时任务时不会从用户profile文件中读取环境变量参数,所以导致在手动执行某个脚本时是成功的,但是写入crontab中定期执行时会出错。根本原因是某些命令无法使用crontab调用,因为用户登陆Linux操作系统的时候,”/etc/profile”, “~/.bash_profile”等配置文件会被自动执行,所以手动执行脚本能够成功,但是crontab执行失败。

大意了啊,环境变量需要直接配在脚本中才行啊,配在环境变量文件里读不到啊,又一次雪的教训!

喜欢艺术的码农
原文地址:https://www.cnblogs.com/zjhgx/p/14450247.html