专栏首页极客生活python crontab 坑

python crontab 坑

最近用Python写了一些数据统计的脚本,并使用crontab自动执行,但是配置crontab总是要过几个坑才行的,这里总结一下这次遇到的坑。

输出

要将crontab命令的输出记录到日志文件中,可以使用重定向,不仅要重定向stdout也要重定向stderr,因为Python解释器会将异常输出到stderr。示例:

$HOME/path/to/script > $HOME/log/file 2>&1 &

环境变量

crontab会以用户的身份执行配置的命令,但是不会加载用户的环境变量,crontab会设置几个默认的环境变量,例如SHELL、PATH和HOME等,一定要注意PATH可不是用户自定义的PATH。

我们往往会在.bash_profile文件中定义一些全局的环境变量,但是crontab执行时并不会加载这个文件,所以你在shell中正常执行的程序,放到crontab里就不行了,很可能就是因为找不到环境变量了。要解决这个问题只能是自己加载环境变量了,可以在shell脚本中添加source $HOME/.bash_profile,或者直接添加到crontab中。

0 12 * * * source $HOME/.bash_profile && $HOME/path/to/script > $HOME/log/file 2>&1 &

路径

我们在写脚本时往往会使用相对路径,但是在crontab执行脚本时,由于工作目录不同,就会出现找不到文件或者目录不存在的问题。

解决方法是脚本中使用绝对路径:

0 12 * * * /usr/local/bin/python /path/to/script > /var/log/file 2>&1 &

编码

我写的Python程序中输出了一些中文(编码是utf-8),在shell中直接执行没有问题,但是crontab执行时出现了UnicodeEncodeError的错误,Google了一下发现这个问题不仅仅是在crontab中会出现,在使用管道或者重定向的时候都会出现这个问题,原因是编码不同。

在终端中直接执行Python程序时,Python会将输出内容自动编码为终端所使用的编码,我使用的终端编码是utf-8,所以不会出错,输出的内容也是正常的。但是在使用管道或者重定向时,编码格式为ascii,Python会用ascii编码格式去encode输出的字符串,但是字符串的编码使用的时utf-8,所以会出现UnicodeEncodeError的错误。

解决方法:

方法一:在程序中可能输出中文的字符串都加上encode('utf-8');
方法二:在crontab中加上PYTHONIOENCODING=utf-8,将Python的stdout/stderr/stdin编码设置为utf-8。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学个Python爽一把

    现在Python已经在编程届家喻户晓了,有各种各样Python从入门到精通的文章,每个软件公司里也都至少有一个会Python的人。

    有福
  • 数据分析python技能之字符串转整数

    将某个字符串格式的字段s转换成整数做一些运算,如果字段内容是非数字的格式,那么就转换成0。

    有福
  • 程序员年龄增大后的职业出路是什么?

    按照目前2018年互联网圈子的工资,北京妥妥地年薪60w以上,这个年薪其实已经超过了80%的打工仔了。当然如果没有别的收入,只靠这个薪水,想在北京这样的地方买房...

    有福
  • Cannot find hadoop installation: $HADOOP_HOME m...

    Cannot find hadoop installation: $HADOOP_HOME must be set or hadoop must be i...

    闵开慧
  • plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory

    plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or direc...

    yaohong
  • Exchange Server2013 SMTP详细日志记录

    在日常运维Exchange Server的时候,我们经常会遇到邮件没有正常送达的问题,这个时候我们往往需要开启SMTP传输日志来进行进一步的分析。下面将一步步的...

    李珣
  • 1-VIII--ViewPager的基本使用

    张风捷特烈
  • 完美解决关于禁止ViewPager预加载的相关问题

    我最近上班又遇到一个小难题了,就是如题所述:ViewPager预加载的问题。相信用过ViewPager的人大抵都有遇到过这种情况,网上的解决办法也就那么几个,终...

    砸漏
  • Linux下安装或升级Python 2.7的操作方法

    下载地址:https://www.python.org/downloads/source/

    砸漏
  • Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】

    C. Palindrome Again !! time limit per test:1 second memory limit per test:64 meg...

    Angel_Kitty

扫码关注云+社区

领取腾讯云代金券