linux 定時任務(crontab)
簡介
crond 是linux下用來周期性的執(zhí)行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務類似,當安裝完成操作系統(tǒng)后,默認會安裝此服務 工具,并且會自動啟動crond進程,crond進程每分鐘會定期檢查是否有要執(zhí)行的任務,如果有要執(zhí)行的任務,則自動執(zhí)行該任務
命令格式
命令格式:crontab [-u username] [-l|-e|-r]
參數(shù):
-u: 只有root才能進行這個任務,也即幫其他用戶新建/刪除crontab工作調(diào)度;
-e: 編輯crontab 的工作內(nèi)容;
-l: 查閱crontab的工作內(nèi)容;
-r: 刪除所有的crontab的工作內(nèi)容,若僅要刪除一項,請用-e去編輯
查看幫助文檔
如果使用 crontab -h 會報錯,但也會輸出一個簡寫的幫助文檔
正確的查看幫助文檔的方法是使用 man crontab
系統(tǒng)的計劃任務放在 /etc/crontab,并且里面有計劃參數(shù)的解析注釋 <分鐘> <小時> <當月的第幾日> <月> <每周的第幾天> <定時執(zhí)行的命令>
周的數(shù)字為0或7時,都代表“星期天”的意思。另外,還有一些輔助的字符,大概有下面這些:
編寫定時任務
crontab的環(huán)境變量在 /etc/crontab 中,與我們系統(tǒng)的環(huán)境變量不同,因此所有文件都要用絕對路徑。用相對路徑不能正常執(zhí)行。
下面以每分鐘執(zhí)行一次為例
定時執(zhí)行計劃
cron.crontab
* * * * * echo `date '+\%F \%T' > /home/chen/output.txt`
1
定時執(zhí)行腳本
不包含變量
shell1.crontab
*/1 * * * * /home/chen/test1.sh`
1
test1.sh
#!/bin/bash #!/bin/bash echo test >> /home/chen/output.txt
1
2
3
包含變量
shell2.crontab
*/1 * * * * /home/chen/test1.sh >> /home/chen/output.txt
1
test2.sh
#!/bin/bash start_time=`date -d '-1 minute' '+%F %T'` end_time=`date '+%F %T'` echo ${start_time} ${end_time}
1
2
3
4
定時執(zhí)行python腳本
python控制臺重定向到文件
py1.crontab
* * * * * /usr/bin/python home/chen/print.py >> /home/chen/output.txt
1
print.py
#!/usr/bin/python # -*- coding: UTF-8 -*- import datetime now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") before_time = (datetime.datetime.now()+datetime.timedelta(minutes=-1)).strftime("%Y-%m-%d %H:%M:%S"); print before_time, now_time
1
2
3
4
5
6
7
8
python直接寫入文件
py2.crontab
* * * * * python home/chen/file.py
1
file.py
#!/usr/bin/python # -*- coding: UTF-8 -*- import datetime now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") before_time = (datetime.datetime.now()+datetime.timedelta(minutes=-1)).strftime("%Y-%m-%d %H:%M:%S"); #print before_time, now_time f = open('/home/chen/output.txt', 'a'); f.write(before_time + ' &' + now_time + '\n') f.close();
1
2
3
4
5
6
7
8
9
10
11
常用命令
執(zhí)行定時任務 crontab <腳本路徑> 命令執(zhí)行計劃,例如 crontab task1.crontab
列出當前任務 cronta -l
編輯當前任務 crontab -e
刪除所有任務 crontab -r
注意事項
在自定義的 crontab 文件 和 crontab -e 的定時任務編輯器中,可以定義變量
統(tǒng)一時刻,只能執(zhí)行一個定時任務。當運行新的任務時,之前的任務會被自動取消
定時計劃可以用批處理文件,例如:* * * * * <批處理文件的完整路徑>。一定要用完整路徑,而非相對路徑?。?!
定時任務的百分號%前面一定要加一個轉(zhuǎn)義符號\,如果不加會被當做換行符,而不是命令
任務計劃中可以定義變量<變量名>=<變量值>。但是“變量值”只能是常量,不能引用其他變量。例如end_time=${date '+%F %T'} 會被當做字符串原樣輸出,無法達到預期效果。如果要定義這種變量,建議換至shell文件中。
如果定時任務沒有任何反應,一定是計劃文件中的語法有誤
由于定時任務都是在后臺執(zhí)行的,因此沒有回顯,可以通過重定向到文件,判斷其是否執(zhí)行成功。另外,通過 tail -f <文件絕對路徑> 持續(xù)輸出
查看日志
編輯配置文件 sudo vim /etc/rsyslog.d/50-default.conf
將cron前面的注釋符去掉 cron.* /var/log/cron.log。
保存文件時用 : w ! sudo tee %
tee 用于讀取輸入文件,同時保存。%表示當前編輯文件。
注意:該方法要求當前編輯用戶必須在 sudoers這個文件中,這也是執(zhí)行sudo命令的要求。
之后重啟 rsyslog 和 cron
sudo service rsyslog restart sudo service cron restart
1
2
后面執(zhí)行 cat /var/log/cron.log 即可查看后續(xù)日志了
查看日志可以發(fā)現(xiàn),每當啟用一個定時任務,之前的就被替換了(即同一時刻只能存在一個定時任務)
發(fā)現(xiàn)報錯:(CRON) info (No MTA installed, discarding output)
原因有兩個:
命令中含有shell指令
執(zhí)行任務過程中會往屏幕輸出內(nèi)容
報錯原因:報錯的主要原因是沒有配置郵件服務器
解決辦法:安裝并重新配置郵件服務器
sudo apt-get install postfix sudo dpkg-reconfigure postfix
1
2
MAIL (mailed 26 bytes of output but got status 0x004b from MTA#012)
查看日志 tail -f /var/log/cron.log,發(fā)現(xiàn)報錯
由于是郵件錯誤,因此查看郵件日志 tail /var/log/mail.log。錯誤如下:fatal: open /etc/postfix/main.cf: No such file or directory
執(zhí)行 sudo dpkg-reconfigure postfix 命令,在配置項里面選擇除了第1項以外的(我是選第2項)
Linux
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。