python crontab 坑

最近用Python寫了一些數(shù)據(jù)統(tǒng)計的腳本,并使用crontab自動執(zhí)行,但是配置crontab總是要過幾個坑才行的,這里總結(jié)一下這次遇到的坑。

輸出

要將crontab命令的輸出記錄到日志文件中,可以使用重定向,不僅要重定向stdout也要重定向stderr,因為Python解釋器會將異常輸出到stderr。示例:

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

環(huán)境變量

crontab會以用戶的身份執(zhí)行配置的命令,但是不會加載用戶的環(huán)境變量,crontab會設(shè)置幾個默認(rèn)的環(huán)境變量,例如SHELL、PATH和HOME等,一定要注意PATH可不是用戶自定義的PATH。

我們往往會在.bash_profile文件中定義一些全局的環(huán)境變量,但是crontab執(zhí)行時并不會加載這個文件,所以你在shell中正常執(zhí)行的程序,放到crontab里就不行了,很可能就是因為找不到環(huán)境變量了。要解決這個問題只能是自己加載環(huán)境變量了,可以在shell腳本中添加source $HOME/.bash_profile,或者直接添加到crontab中。

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

路徑

我們在寫腳本時往往會使用相對路徑,但是在crontab執(zhí)行腳本時,由于工作目錄不同,就會出現(xiàn)找不到文件或者目錄不存在的問題。

解決方法是腳本中使用絕對路徑:

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

編碼

我寫的Python程序中輸出了一些中文(編碼是utf-8),在shell中直接執(zhí)行沒有問題,但是crontab執(zhí)行時出現(xiàn)了UnicodeEncodeError的錯誤,Google了一下發(fā)現(xiàn)這個問題不僅僅是在crontab中會出現(xiàn),在使用管道或者重定向的時候都會出現(xiàn)這個問題,原因是編碼不同。

在終端中直接執(zhí)行Python程序時,Python會將輸出內(nèi)容自動編碼為終端所使用的編碼,我使用的終端編碼是utf-8,所以不會出錯,輸出的內(nèi)容也是正常的。但是在使用管道或者重定向時,編碼格式為ascii,Python會用ascii編碼格式去encode輸出的字符串,但是字符串的編碼使用的時utf-8,所以會出現(xiàn)UnicodeEncodeError的錯誤。

解決方法:

方法一:在程序中可能輸出中文的字符串都加上encode('utf-8');
方法二:在crontab中加上PYTHONIOENCODING=utf-8,將Python的stdout/stderr/stdin編碼設(shè)置為utf-8。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡介 在編程中常??梢砸姷礁鞣N字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 9,092評論 0 13
  • 原文鏈接 《Python數(shù)據(jù)分析》(Python for Data Analysis, 2nd Edition)第...
    李紹俊閱讀 8,778評論 0 5
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號 簡介有稍微接觸python的人就會知道,python中...
    ayuLiao閱讀 3,397評論 1 5
  • (這是很早之前寫的但內(nèi)容沒有太過時,發(fā)到這邊補全一下...)面向初學(xué)者介紹Python相關(guān)的一些工具,以及可能遇到...
    jagttt閱讀 67,521評論 3 44
  • 畢業(yè)生都走了。 我已經(jīng)接觸畢業(yè)四次了。 唯一一次哭泣是初中畢業(yè)。 每一次畢業(yè),似乎,都發(fā)生在昨天。 小學(xué)課本上說過...
    大俠三劍客閱讀 174評論 0 0

友情鏈接更多精彩內(nèi)容