我是作運維開發的,偶爾會有人來問我一些關於"crontab不能正常運行"的問題。python
本着「授人以魚不如授人以漁」的觀點,在這裏總結一下可能發生該情況的緣由.shell
在分析以前,咱們先確認一個前提: 就是操做命令自己的執行並無問題,在shell下可正常執行,沒有權限問題,更沒有參數缺乏的問題.運維
簡單的校訂方法就是: 將crontab -l
下的該命令,直接複製到shell下運行,看是否正常執行.編碼
在以上的前提下,多是以下的幾個緣由,致使了crontab不能正常執行.操作系統
好比這個命令:code
echo `date +%Y%m%d`
這個命令,在shell下直接執行是沒問題的,可是在crontab中就有問題. 緣由是crontab中不能出現非法字符%
blog
解決方法也很簡單,既能夠將命令寫在另外一個sh文件中,而後再來執行該文件;也可使用\
符號進行轉義.進程
能夠在 man 5 crontab
中查看到該問題的說明,以下圖: crontab
定時任務有兩種編輯方法,一種是root用戶下編輯/etc/crontab文件: vi /etc/crontab
;utf-8
一種是在某個用戶下(多是root,可能非root),執行crontab -e
進行編輯.
前者的格式相比於後者,多了一個執行命令的「用戶身份」的字段.以下圖:
這很好理解, /etc/crontab 對全部用戶都是同一個文件,固然須要指明是以哪一個用戶來執行命令了.
以 echo "right" >> /tmp/output_right.txt
命令爲例,
在前者須要寫成 */1 * * * * root echo "right" >> /tmp/output_right.txt
在後者須要寫成 */1 * * * * echo "right" >> /tmp/output_right.txt
這個就太好檢查了, 執行service crond status
查看該服務的運行狀態.
若是進程已經dead,重啓一下便可 service crond start
這個僅僅是一個可能的緣由, 不一樣系統上的表現不是絕對的. 可能跟操做系統的默認編碼有關.總之避免中文的輸出吧.
好比一段簡單的python代碼:
# -*- coding: utf-8 -*- python u'中文'
以上代碼保存爲文件demo.py. 在shell中執行 python demo.py
是沒問題的, 可是在crontab就可能出現問題.