资讯专栏INFORMATION COLUMN

总是出问题的Crontab

Apollo / 417人阅读

摘要:最近用写了一些数据统计的脚本,并使用自动执行,但是配置总是要过几个坑才行的,这里总结一下这次遇到的坑。路径我们在写脚本时往往会使用相对路径,但是在执行脚本时,由于工作目录不同,就会出现找不到文件或者目录不存在的问题。

最近用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执行脚本时,由于工作目录不同,就会出现找不到文件或者目录不存在的问题。

解决方法是脚本中使用绝对路径或者在执行程序前切换工作目录,例如直接在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。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37531.html

相关文章

  • python脚本定时调度钉钉机器人

    摘要:首先是添加群自定义机器人在钉钉上选择需要发送消息的群,选择群机器人添加机器人自定义机器人添加,如下图如需要,可以为机器人设置头像。 由于公司用的通讯工具是钉钉,而群机器人可以实现自动化的信息同步,因此这里总结了自己使用钉钉自定义机器人一些方法,供参考抛砖引玉。 首先是添加群自定义机器人 在钉钉上选择需要发送消息的群,选择群机器人-添加机器人-自定义机器人-添加,如下图: showImg...

    TigerChain 评论0 收藏0
  • PHP 实现定时任务几种方法

    摘要:为系统增加的第一行代码不会影响该脚本在下的运行,因此您也可以用该方法编写跨平台的脚本程序。指定会话页面在客户端中的有限期分钟缺省下为分钟。最原始的博主没有找到,只能在此声明,特为转载。 这几天需要用PHP写一个定时抓取网页的服务器应用. 在网上搜了一下解决办法, 发现OSchina的 一个问题的解答很精彩(值得一看,谢谢大牛们的精彩回答O(∩_∩)O~), 提出几种解决办法.现总结如下...

    huhud 评论0 收藏0
  • 日志切割logrotate和定时任务crontab详解

    摘要:在轮循任务完成后,已轮循的归档将使用进行压缩。在日志轮循期间,任何错误将被忽略,例如文件无法找到之类的错误。在这种情况下,进程将立即再次读取其配置并继续运行。表示,每隔分钟,执行打印一次命令第二步添加定时任务。 1、关于日志切割  日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,...

    KnewOne 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<