一、定時任務概念
爲什麼要使用Crond定時任務?
例如:我們數據庫或者程序需要每天晚上0點做一次全備,定時同步時間服務器等等
Linux系統定時任務軟件的種類:
at 適合僅執行一次就結束的調度命令,可以被crontab取代,
crontab 可以週期性的執行任務,需要開啓crond服務 在生產工作中最常用到的命令
anacron 主要用於非7*24小時開機的服務器,
提示:crond服務,crontab命令是生產工作中重要的命令應用,其他的很少使用,可以忽略
重點學習crondtab定時任務
二、安裝crond服務
yum -y update
yum -y
install
cronie yum-
cron
三、定時任務使用
指令語法:
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab) 編輯用戶命令
-l (list user's crontab) 列表
-r (delete user's crontab) 刪除用戶任務
-i (prompt before deleting user's crontab) 在刪除前確認
-s (selinux context)
參數 | 含義 | 指定示例 |
-l | 查看crontab文件內容,提示:l爲list的縮寫 | crontab -l |
-e | 編輯crontab文件內容,提示:e可爲edit 的縮寫 | crontab -e |
-i | 刪除crontab文件內容,刪除前會提示確認,用得少 | crontab -ri |
-r | 刪除crontab文件內容。用得很少 | crontab -r |
-u | 指定使用的用戶執行任務 | crontab -u boy -l |
特別強調:-I –r參數在生產中很少用,沒什麼需求必須要用-e進去編輯即可 補充:crontab {-l|-e}實際上就是在操作/var/spool/cron/當前用戶這樣的文件 |
通過crontab可以在固定的時間執行指定的系統指令,時間單位可以是分鐘、小時、日、月、周以及以上的任意組合,(日和周不要組合)
crond是一個服務,crontab是一個命令
crond服務通過crontab命令可以很容易的實現週期性的日誌分析或數據備份等運維場景工作。
使用者權限及定時任務文件
文件 | 說明 |
/etc/cron.deny | 該文件中所列用戶不允許使用crontab命令 |
/etc/cron.allow | 該文件中所列用戶允許使用crontab命令,優先於/etc/cron.deny |
/var/spool/cron/ | 所有用戶crontab配置文件默認都存放在此目錄,文件名以用戶名命名 |
crontab -l 查看當前用戶定時任務
調用/var/spool/cron/目錄下相關用戶的定時任務信息
[root@localhost log]# cat /var/log/cron 查看定時任務日誌
Crontab定時任務的書寫格式
用戶的定時任務一般分爲6段(每段空格分隔,系統的定時任務則/etc/crontab分爲7段),前五段爲時間的設定段,第六段爲所要執行的命令或腳本任務段
基本格式如下:
01 * * * * cmd
02 4 * * * cmd
22 4 * * 0 cmd
42 4 1 * * cmd
提示:
1.cmd爲要執行的命令或腳本,如/bin/sh /server/scripts/dingjian.sh
2.每個段之間必須要有空格
段 | 含義 | 取值範圍 |
第一段 | 代表分鐘 | 00-59 |
第二段 | 代表小時 | 00-23 |
第三段 | 代表日期 | 01-31 |
第四段 | 代表月份 | 01-12 |
第五段 | 代表時期 | 0-7(0和7都代表是星期日) |
提示:時間記憶口決:分時日月周
Crontab語法格式中特殊符號含義如表:
特殊符號 | 含義 |
* | *號,表示任意時間都,也是”每”的意思,舉例:如00 23 * * *cmd表示每月每週每日的23:00都執行cmd任務 |
- | 減號,表示分隔符,表示一個時間段範圍段,如17-19點,每小時的00分執行任務,00 17-19 * * * cmd 。就是17,18,19點整點分別執行的意思 |
, | 逗號,表示分隔時段的意思,30 17,18,19 * * * /bin.sh /scripts/dingjian.sh表示每天17,18和19點的半點時刻執行/scripts/dingjian.sh腳本。也可以和”-”結合使用,如:30 3-5,17-19 * * * /scripts/dingjian.sh |
/n | N代表數字,即”每隔n單位時間”,如:每10分鐘執行一次任務可以寫成 */10 * * * * cmd,其中“*/10”的範圍是0-59,因此也可以寫成0-59/10 |
cron服務是Linux的內置服務,但它不會開機自動啓動。可以用以下命令啓動和停止服務:
/sbin/service crond start
/sbin/service crond stop
/sbin/service crond restart
/sbin/service crond reload
/sbin/service crond status
或
查看crond.service的啓動狀態
stemctl status crond.service
開啓crond.service服務命令
systemctl start crond.service
停止crond.service服務命令
systemctl stop crond.service
把cron服務加入linux開機自啓動:
[root@localhost ~]# systemctl enable crond.service
[root@localhost ~]# systemctl is-enabled crond.service
enabled
ps -ef |grep crond|grep -v grep #crond後臺的工作情況並過濾出來
[root@dingjian ~]# ps -ef |grep crond|grep -v grep
root 1091 1 0 Nov19 ? 00:00:17 crond
查看當前用戶的crontab,輸入 crontab -l;
編輯crontab,輸入 crontab -e;
清空定時任務crontab,輸入 crontab -r
四、定時任務範例
範例1:每5分鐘同步一次系統時間
echo '#time sync by mrxiong at 2018-3-10'>/var/spool/cron/root
echo '*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1' >>/var/spool/cron/root
或者 crontab –e 然後把
#time sync by mrxiong at 2018-3-10
*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1
加入到裏面保存退出
五、應用場景定時任務應用範例
例1:每分鐘打印一次自己的名字拼音全拼到”/server/log/自己的名字命名的文件”中。
解答:
方法1:crontab -e 輸入以下內容
#pring a name by mrxiong
* * * * * echo "mrxiong" >>/service/log/mrxiong
保存退出
[root@localhost ~]# tail -f /service/log/mrxiong
mrxiong
用tail -f 命令跟蹤文件內容
方法2:
* * * * * echo "huanweixiong-->> $(date +\%F" "\%T)" >>/service/log/dingjian
提示:在任務中,%前面一定要加轉義\
如果不用轉義,可以用另一種方法:
用腳本的方式:
[root@localhost scripts]# echo "echo 'blog.dingjian.me -->> $(date +%F" "%T)'>>/server/log/dingjian.log" >echo.sh
[root@localhost scripts]# cat echo.sh
echo 'blog.dingjian.me -->>2018-1-30 19:30:33'>>/server/log/dingjian.log
[root@localhost scripts]# sh echo.sh
[root@localhost scripts]# cat /server/log/dingjian.log
blog.dingjian.me -->> 2018-1-30 19:28:38
blog.dingjian.me -->> 2018-1-30 19:28:53
blog.dingjian.me -->> 2018-1-30 19:28:53
blog.dingjian.me -->> 2018-1-30 19:30:33
/var/log/cron 定時任務的日誌目錄
例2:每週六、日上午9:00和下午14:00執行mrxiong.sh(/server/script/mrxiong.sh)
答案:
#cron job for ett by mrxiong 2018-12-12
00 9,14 * * 6,0 /server/script/mrxiong.sh >/dev/null 2>&1
例3:每隔1分鐘,打印一個+號到dingjian.log,請給出crontab完整命令。
解答:
生成腳本:
[root@localhost scripts]# echo '#!/bin/sh' >>./echo.sh
[root@localhost scripts]# echo 'echo + >>/tmp/dingjian.log' >>./echo.sh
[root@localhost scripts]# cat echo.sh
#!/bin/sh
echo + >>/tmp/dingjian.log
測試配置好的腳本:
[root@localhost scripts]# sh echo.sh
[root@localhost scripts]# sh echo.sh
[root@localhost scripts]# sh echo.sh
[root@localhost scripts]# cat /tmp/dingjian.log
+
+
+
+
配置定時任務:
[root@localhost scripts]# echo '#print a "+" to /tmp/dingjian.log by dingjian 2018-11-28' >>/var/spool/cron/root
[root@localhost scripts]# echo '*/1 * * * * /bin/sh /server/scripts/echo.sh >/dev/null 2>&1' >>/var/spool/cron/root
[root@localhost scripts]# crontab -l #查看定時任務例表
#print a "+" to /tmp/dingjian.log by dingjian 2018-11-28
*/1 * * * * /bin/sh /server/scripts/echo.sh >/dev/null 2>&1
查看定時任務結果 :
[root@localhost scripts]# cat /tmp/dingjian.log
+
+
[root@localhost scripts]# watch cat /tmp/dingjian.log
提示:watch 默認每兩分鐘查看後面的命令
如: watch cat /tmp/dingjian.log 查看文件
watch ls -l /tmp 查看目錄
範例2:每隔2個小時,將/etc/services文件打包備份到/tmp下(最好每次備份成不同的備份包)
答:
#生成腳本:
[root@localhost ~]# cd /server/scripts/
[root@localhost scripts]# ll
total 4
-rw-r--r--. 1 root root 66 Nov 26 21:26 tar.sh
[root@localhost scripts]# vi tar.sh
在腳本中加入:
cd /etc/
tar zcf /tmp/service_$(date +%Y%m%d%H%M).tar.gz ./services
[root@localhost scripts]# rm /tmp/* -rf
#測試腳本能不能運行
[root@localhost scripts]# sh tar.sh
[root@localhost scripts]# ls -l /tmp
total 128
-rw-r--r--. 1 root root 127319 Nov 27 00:29 service_2018112700.tar.gz
#配置定時任務:
[root@localhost scripts]# crontab -e
把以下內容加入:
####註釋
00 */2 * * * /bin/sh /server/scripts/tar.sh >/dev/null 2>&1
保存退出
提示:所以一般建議打包某一文件, 要到這個文件的上一層目錄打包,不要從根目錄打包,不然一解壓會把根覆蓋了 如:打包/etc/services.就進到/etc/目錄來打包services,
[root@dingjian scripts]# sh tar.sh& 加個&表示在後臺運行這個腳本
範例3:每天晚上12點,打包站點目錄/var/www/html備份到/data目錄下(最好每次備份按時間生成不同的備份包)
解答:
[root@localhost scripts]# mkdir /var/www/html -p #創建測試環境
[root@localhost scripts]# mkdir /data
[root@localhost scripts]# date +%F #命令測試
2018-11-27
[root@localhost scripts]# cd /var/www/
[root@localhost www]# tar zcf /data/data_$(date +%F).tar.gz ./html #注意打包要到要複製的
[root@localhost www]# ls -l /data 文件的上一層目錄打包
total 4
-rw-r--r--. 1 root root 111 Nov 27 01:13 data_2018-11-27.tar.gz
[root@localhost www]# cd /server/scripts/ #將測試號的腳本放入到腳本測試
[root@localhost scripts]# rm /data/* -rf
[root@localhost scripts]# ls /data
[root@localhost scripts]# vi tarhtml.sh #創建腳本
cd /var/www/
tar zcf /data/data_$(date +%F).tar.gz ./html
[root@localhost scripts]# sh /server/scripts/tarhtml.sh #執行全路徑測試腳本
[root@localhost scripts]# ls /data
data_2018-11-27.tar.gz
[root@localhost scripts]# crontab -e #編輯定時任務,注意規範書寫
#tar /var/www/html everyday by dingjian 2018-11-27
00 00 * * * /bin/sh /server/scripts/tarhtml.sh >/dev/null 2>&1
[root@localhost scripts]# crontab -l #查看編輯的結果
#tar /var/www/html everyday by dingjian 2018-11-27
00 00 * * * /bin/sh /server/scripts/tarhtml.sh >/dev/null 2>&1
特殊的調試
六、生產場景如何調試crontab定時任務
1.增加執行頻率調試任務
調試時,把任務執行頻率調快一點,如:每分鐘、每5分鐘執行一次,或者比當前時間推遲5分鐘以後,看能否執行,如果正常沒問題了,再改成需要的任務的執行時間。
強調:有些任務是不允許頻繁執行的,如:定時往數據庫裏插入數據,這樣的任務就要在測試機上測試好,然後正式線上出問題的機會就少了。
規範的公司開發和運維人員的操作流程:個人的開發配置環境--à辦公室的測試環境-àidc機房的測試環境-àidc機房的正式環境
2. 調整系統時間調試任務
用正確的執行任務的時間,設置完成後,可以修改下系統當前時間,改成任務執行時間的前五分鐘來測試(或者重啓定時任務服務)。如:定時任務9:00執行,我們可以把系統時間改成8:55分,然後觀察是不是正確執行。如果是生產環境服務器不要這樣處理,測試環境可以使用這個手段
3.通過日誌輸出調試定時任務
在腳本中加入日誌輸入,然後把輸出到指定的日誌中,然後觀察日誌內容結果,看是否執行或正確執行,或把腳本結果定向到一個log文件裏,重定向〉即可,不要用>>追加,這樣晶習就不會一直變大
如:定時任務中加輸出
#study task by dingjian at 20181129
00 9,4 * * 6,0 /bin/sh /server/scripts/dingjian.sh >/tmp/log.log 2>&1
腳本中加輸出
[root@dingjian scripts]# cat tar.sh
#!/bin/sh
cd /
tar zcvf /tmp/etc_$(date +%Y%m%d%H).tar.gz ./etc >/tmp/tmp.log 2>&1
4.注意一些任務命令帶來的問題
*/ 1 * * * * echo “==” >>/tmp/dingjian.log >/dev/null 2>&1 這是隱蔽的無法正確執行的任務配置,原因是前面多了個>> , 或者去掉結尾的>/dev/null 2>&1
強調:此問題是因爲前面己有了重定向,後面要去掉>/dev/null 2>&1
5. 在調試java程序任務的時候,注意環境變量,把環境變量的定義加到腳本里。
例:
#!/bin/sh
export JAVA_HOME=/application/jdk1.6
export PATH=$JAVA_HOME/bin:$PATH
export SH_HOME=/application/resin/webapps/ROOT/
export LIB=$SH_HOME/WEB-INF/lib
..省略部分...
定時任務
00 9,14 * * * nohup /scripts/resin/shell/Task.sh & >/app/log.log 2>&1
6.通過定時任務日誌調試定時任務
查看定時任務服務日誌
[root@localhost scripts]# tail -f /var/log/cron
Nov 29 01:39:01 dingjian CROND[8557]: (root) CMD (/bin/sh /server/scripts/echo.sh >/dev/null 2>&1)
Nov 29 01:40:01 dingjian CROND[8566]: (root) CMD (echo "==" >>/tmp/dingjian1.log >/dev/null 2>&1)
Nov 29 01:40:01 dingjian CROND[8567]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Nov 29 01:40:01 dingjian CROND[8568]: (root) CMD (/bin/sh /server/scripts/echo.sh >/dev/null 2>&1)
七、Crontab生產問題案例及解決過程
No space left on device故障
面試題:維護的時候,創建文件提示”No space left on device”,請問你這是什麼故障:
解答:磁盤空間block滿了或者inode被佔滿了
故障描述及說明:
某年某月甘日某時,某人在工作中設置crontab定時任務規則保存時,提示” No space left on device”,此時用df -h檢查磁盤,發現還有剩餘空間,用df -I 檢查則顯示/var目錄己佔用100%的inode數量,看來是inode數量耗盡,導致系統無法在/var目錄下創建文件,因爲定時任務的配置在/var/spool/cron下,ext3文件系統中,每個文件需要佔一個inode,
No space left on device 故障解決辦法:
最後經過檢查發現在/var/spool/clientmqueue/下有超多的文件,執行ls /var/spool/clientmqueue命令查看,很長時間沒能顯示出結果,執行cd /var/spool/clientmqueue;rm –f *會自動跳出來,也是無法刪除,最後只能通過xargs命令來配合解決,清理實際命令爲:cd /var/spool/clientmqueue&&ls|xargs rm –f
在清理時,如果數量特別多的時候,執行ls|xargs rm –f 命令也會長時間無反應,那是命令在處理中,當然我們也可以使用更快的刪除方法,如直接使用cd /var/spool&&rm –rf clientmqueue,刪除上級目錄,然後執行
mkdir clientmqueue&&chmod 770 clientmqueue&&chown smmsp.smmsp -R /var/spool/clientmqueue
修改回/var/spool/clientmqueue目錄在系統中的原來默認權限
[root@localhost scripts]# ls -ld /var/spool/clientmqueue/
drwxrwx---. 2 smmsp smmsp 4096 Nov 26 15:41 /var/spool/clientmqueue/
故障原因分析:
當系統中crond定時任務執行程序有輸出內容時,輸出內容會以郵件形式發給crond的用戶(默認是root),而sendmail等mail服務沒有啓動時,這些輸出內容以爲支在郵件隊列臨時目錄,產生這些碎文件,導致消耗inode數量,一旦inode數量耗盡,就會導致系統無法寫入文件,而報上述錯誤:No space left on device.
亡羊補牢解決方法:
1) 儘量將crontab裏面的命令或腳本中的命令結尾加上>/dev/null 2>&1,或在做定時執行腳本時,把屏幕輸出定向到指定文件裏
2) 當然也可以開啓郵件服務,不過最好不做,因爲郵件服務會帶來安全問題
3) 優化系統,加定時清理任務,如find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f
八、Crontab定時任務生產應用問題8箴言
1.export變量問題
crontab執行shell時只能識別爲數不多的系統環境變量,一般用戶定義的普通變量是無法識別的,如果在編寫的腳本中需要使用這些變量,最好使用export重新聲明下該變量,腳本才能正常執行,如:生產 情況和java相關的服務任務和腳本
2.任務路徑問題:
Crontab執行shell時,一定要用絕對路徑
3. 腳本權限問題
要確保crontab的執行者有訪問shell腳本所在目錄並且執行此shell腳本的權限(可用chmod和chown修改腳本權限和所有者)。當然,最佳方法是執行腳本前加/bin/sh執行測試下,在配置任務執行腳本時,可以省略當前用戶配置,但最好帶上/bin/sh.否則有可能因爲忘了爲腳本設定執行權限,而無法完成任務
範例:
* * * * * /server/scripts/tar.sh #此時如果tar.sh沒有可執行權限,就無法執行了
要在帶上/bin/sh
* * * * * /bin/sh /server/scripts/tar.sh
4.時間變量問題
%號在crontab任務中被認爲是newline.需要用\來轉義,crontab任務命令中,如果有”dat+%Y%m%d”,必須替換爲: ”dat+\%Y\%m\%d”,但寫腳本中就不需要了,
範例:
#tar commend by dingjian at 2013-11
*/1 * * * * /cd /etc/&&tar zcvf /tmp/service_$(date +\%Y\%m\%d\%H\%M).tar.gz ./services
腳本實現方法:
配置腳本:
echo 'cd /etc/&&tar zcvf /tmp/service_$(date +%Y%m%d%H%M).tar.gz ./services'>./tar.sh
配置定時任務
[root@localhost scripts]# echo '#tar /etc/services by dingjian at 2018-11-29' >>/var/spool/cron/root
[root@localhost scripts]# echo '*/1 * * * * /bin/sh /server/scripts/tar.sh >/dev/null 2>&1' >>/var/spool/cron/root
[root@localhostscripts]# crontab -l
#tar /etc/services by dingjian at 2013-11-29
*/1 * * * * /bin/sh /server/scripts/tar.sh >/dev/null 2>&1
5.>/dev/nul 2>&1 問題
當定時任務在你所指定的時間執行後,系統會寄一封信給你,顯示該程式執行的內容,若系統未開啓郵件服務就會導致郵件臨時目錄/var/spool/clientmqueue碎文件逐漸增多,以至於大量消耗inode數量,其實可以在每一行任務結尾空一行之後加上>/dev/nul 2>&1將輸出定向爲空來規避這個問題
如果需要打印日誌輸出,也可以追加到指定的日誌文件裏,儘量不要留空。如果任務本身是命令的話,添加>/dev/nul 2>&1時要慎重,需多測試並且有檢查手段。如:*/1 * * * *echo”==”>> /tmp/dingjian.log >/dev/nul 2>&1,該任務規則就是無法執行的。
說明:/dev/null爲特殊設備,表示黑洞設備或空設備。2>&1表示讓標準錯誤或標準輸出一樣都定向到空設備,本命令內容就是把腳本的輸出重定向到/dev/null,即不記錄任務輸出,也不給充管理員發郵件
6.定時任務加註釋
加必要註釋,英文註釋: 如:什麼人,什麼時間,因爲誰,做了什麼事
如:#cron job for ett by dingjian 2018-12-12
00 9,14 * * 6,0 /bin/sh /server/script/dingjian.sh >/dev/null 2>&1
7.使用腳本程序替代命令
使用腳本執行任務可以讓我們少範錯誤,提升效率、規範定時任務中執行命令,定時任務中執行命令有一些限制,如時間變量問題,多個重定向命令混用問題等
8.避免不必要的程序輸出
在開發定時任務程序或腳本時,在調試好腳本程序後,應儘量把DEBUG及命令輸出的內容信息屏蔽掉,如果不需要,可以定向到指定日誌文件裏,以免產生多餘的系統垃圾
如:平時打包喜歡tar zcvf 這個-v參數就是查看打包信息的,做成定時任務就不要輸出了。
範例:
*/1 * * * * cd /etc/&&tar zcvf /tmp/service.tar.gz ./services 這裏的v參數就不必要的
九、crond export變量問題生產案例
範例:
我寫了一個重啓resin的腳本,由於業務原因,需要定時在某一個時間重啓下resin服務器,於是就在
crontab裏配置瞭如下內容
50 17 * * * 1-5 root /usr/local/bin/resin_restart.sh
其中,resin_restart.sh內容如下:
#!/bin/sh
/usr/local/bin/xxresin_stop.sh
/usr/local/bin/xxresin_start.sh
問題來了,服務器雖然定時起來了,但是卻報如下錯誤:
Resin can`t load com.sun.tools.javac.Main. Usually this means that the JDK tools.jar is missing from the classpath
Possibly because of using a JRE instead of the JDK.
You can either add tools, jar to the classpath or change the compiler to an external one with <java compiler=’javac’/> or jikes.
但是,明明己在profile裏配置了環境變量,爲啥還找不到呢,
故障解決:
由於export變量問題導致:具體爲,crontab 執行shell時只能識別爲數不多的系統環境 變量,
普通環境變量一般是無法識別的,如果在編寫的腳本中需要使用變量,最好使用export重新聲時下該變量
然後在resin重啓腳本里重新定義了下環境變量,腳本如下:
#!/bin/sh
JAVA_HOME=”/opt/jdk1.6.0_18”
CLASSPATH=$JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/lib/dt.jar;$JAVA_HOME/lib/tools.jar;/opt/nginx-0.7.61/sbin;/jdk1.6.0_18/bin;/opt/resin-3.0.25/bin;$PATH
export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC CLASSPATH
/usr/local/bin/xxresin_stop.sh
/usr/local/bin/xxresin_start.sh
十、定時任務的7個要領
1. 加必要註釋,英文註釋: 如:什麼人,什麼時間,因爲誰,做了什麼事
如:#cron job for ett by dingjian 2018-12-12
00 9,14 * * 6,0 /bin/sh /server/script/dingjian.sh >/dev/null 2>&1
2.執行shell腳本任務前加/bin/sh
執行定時任務時,如果是執行腳本,在腳本前面帶上/bin/sh命令 否則可能因忘了爲腳本設定執行權限X,從而無法完成任務,所以凡是腳本任務,都要在前面加上/bin/sh
如:#cron job for ett by dingjian 2018-12-12
00 9,14 * * 6,0 /bin/sh /server/script/dingjian.sh >/dev/null 2>&1
不管s.sh有沒有x權限,都可以執行腳本文件
3. 需要root權限執行的任務可以登陸到root用戶下然後設置,如果不需要root權限,可以登陸到普通用戶下(也可以直接在root下crontab -u oldboy -e 的寫法直接設置),然後設置。這裏要特別注意不同用戶的環境變量問題,如果是調用了系統環境變量/etc/profile(如生產場 景中java程序的定時任務),最好在程序腳本中將用到的環境變量重新export下
平時工作中儘量多用crontab -e 和crontab -l 去編輯和查看定時任務,因爲會有語法檢查
如果給1000臺服務器同時添加系統時間同步,可以使用分發工具或者批量運維腳本(腳本內容就是echo”腳本任務規則”>>/var/spool/cron/root)
4. 定時任務結尾加>/dev/null 2>&1 如果追加指定日誌文件裏,就不要和/dev/null同時存在
/dev/null 定符設備,黑洞設備 2>&1指定是標準錯誤和標準輸出一樣 整個意思是把腳本的正常和錯誤輸出都重定向到/dev/null.即不記錄任何輸出
如果定時任務結尾不加>/dev/null 2>&1 很容易導致硬盤inode空間被佔滿,從而系統服務不正常
5.生產任務程序不要隨意打印輸出信息,
如:打包時去掉-v 不必要的輸出就不要輸出,如果一定要輸出,也可以指定日誌文件
[root@localhost /]# tar zcf etc.tar.gz /etc >&/dev/null #輸出到黑洞設備
[root@localhost /]# tar zcvf etc.tar.gz /etc >&/tmp/tar.log #輸出指定日誌文件
6.定時任務命令或程序最好寫到腳本里執行
如:* * * * * echo "huanweixiong-->> $(date +\%F" "\%T)" >>/service/log/huangweixiong
提示:在任務中,%前面一定要加轉義\
如果不用轉義,可以用另一種方法:
用腳本的方式:
[root@localhost ~]# mkdir /server/scripts -p
[root@localhost ~]# cd /server/scripts/
[root@localhost scripts]# vi echo.sh
輸入: echo "mrxiong-->> $(date +%F" "%T)" >>/service/log/mrxiong.log
[root@localhost scripts]# crontab –e
加入
#pring a name by mrxiong
* * * * * /bin/sh /server/scripts/echo.sh >/dev/null 2>&1
7.定時任務路徑要用絕對路徑,絕對路徑就是從根開始的完整路徑,當然也要確保路徑對應的目錄要存在才行,日誌文件可以不存在