老是出问题的Crontab

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

输出

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

$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执行脚本时,因为工做目录不一样,就会出现找不到文件或者目录不存在的问题。code

解决方法是脚本中使用绝对路径或者在执行程序前切换工做目录,例如直接在crontab命令中切换工做目录:crontab

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

编码

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

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

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

相关文章
相关标签/搜索