最近用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。
crontab命令總結
基本用法 crontab命令用於在linux伺服器上設定定時任務,通過crontab help可以檢視命令使用方式 usage crontab u user file crontab u user e l r default operation is replace,per 1003.2 e edi...
crontab用法總結
crontab是什麼 crontab命令常見於unix和類unix的作業系統之中,用於設定週期性被執行的指令。crontab 一詞 於希臘語chronos 原意是時間.而crond是linux下用來週期性的執行某種任務或等待處理某些事件的乙個守護程序,作業系統缺省會安裝此服務工具,並且會自動啟動cr...
crontab使用問題
20120908 wcdj crontab e 新增任務 crontab l 顯示新增的任務 crontab r 刪除全部任務 1 vi etc crontab 新增任務 2 etc init.d cron restart 使之生效 注意一點 環境變數的問題,要確保crontab使用的是當前使用者的...