crontab的问题总结
2015-12-31 09:53
197 查看
最近用Python写了一些数据统计的脚本,并使用crontab自动执行,但是配置crontab总是要过几个坑才行的,这里总结一下这次遇到的坑。
我们往往会在
解决方法是脚本中使用绝对路径或者在执行程序前切换工作目录,例如直接在crontab命令中切换工作目录:
在终端中直接执行Python程序时,Python会将输出内容自动编码为终端所使用的编码,我使用的终端编码是utf-8,所以不会出错,输出的内容也是正常的。但是在使用管道或者重定向时,编码格式为ascii,Python会用ascii编码格式去encode输出的字符串,但是字符串的编码使用的时utf-8,所以会出现UnicodeEncodeError的错误。
解决方法:
方法一:在程序中输出的字符串都加上
方法二:在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执行脚本时,由于工作目录不同,就会出现找不到文件或者目录不存在的问题。解决方法是脚本中使用绝对路径或者在执行程序前切换工作目录,例如直接在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中会出现,在使用管道或者重定向的时候都会出现这个问题,原因是编码不同。在终端中直接执行Python程序时,Python会将输出内容自动编码为终端所使用的编码,我使用的终端编码是utf-8,所以不会出错,输出的内容也是正常的。但是在使用管道或者重定向时,编码格式为ascii,Python会用ascii编码格式去encode输出的字符串,但是字符串的编码使用的时utf-8,所以会出现UnicodeEncodeError的错误。
解决方法:
方法一:在程序中输出的字符串都加上
encode('utf-8');
方法二:在crontab中加上
PYTHONIOENCODING=utf-8,将Python的
stdout/stderr/stdin编码设置为utf-8。
相关文章推荐
- Nodejs源码解析之util
- Maven仓库管理之Nexus
- Centos 下Storm集群的搭建及Java客户端环境
- 震屏动画
- 友盟统计的那些事
- json(http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html)
- C#进行MapX二次开发之图层操作
- UWP x:bind
- qtp 基础编程小技巧(三)
- 查询表的基本信息
- 我的网站
- 11.主题结构
- 观察者模式 - Observer
- H.264 NAL层解析(0x00000001,编码,打包,NALU)
- Android布局之LinearLayout线性布局
- 混完了2015,依然不知道你自己要什么?
- 怎样解决VS2013模块对于SAFESEH 映像是不安全的
- 动态模糊,毛玻璃
- 全站HTTPS来了
- openssl安装