前言
筆者在進行試驗時,有以下幾個操作習慣,具體參考。
Centos7默認開通了80端口和22端口。
查看服務相關信息
$ systemctl status crond // crond狀態 $ systemctl is-enabled crond // 是否開機自啟
基礎知識
Cron時間表達式詳解
表達式概述
.---------------- minute (0 - 59):代表分鍾,取值范圍00-59
| .------------- hour (0 - 23):代表小時,取值范圍00-23
| | .---------- day of month (1 - 31):代表月份中的日期,取值范圍01-31
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...:代表月份,取值范圍01-12
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * user-name command to be executed
特殊符號含義
特殊符號 | 含義 |
---|---|
* | 表示任意時間都,也是”每”的意思,舉例:如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單位時間”,如:每10分鍾執行一次任務可以寫成 /10 * * * * cmd,其中“/10”的范圍是0-59,因此也可以寫成0-59/10 |
命令概述
指定語法
crontab [-u user] file crontab -u user (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/當前用戶這樣的文件
相關文件
文件 | |
---|---|
/etc/cron.deny | 該文件中所列用戶不允許使用crontab命令 |
/etc/cron.allow | 該文件中所列用戶允許使用crontab命令,優先於/etc/cron.deny |
/var/spool/cron/ | 所有用戶crontab配置文件默認都存放在此目錄,文件名以用戶名命名 |
/var/log/cron | 定時任務的執行日志 |
示例
// 1. 查看當前用戶的定時任務
$ crontab -l
// 2. 為當前用戶編輯一個定時任務
$ crontab -e // 3. 清空當前用戶的定時任務 $ crontab -r // 4. 每分鍾打印一次自己的英文名字到 /home/test/name.txt 的文件中 方式一: $ mkdir /home/test // 創建文件目錄 $ crontab -e // 輸入以下內容 # print my name * * * * * echo "zeanzai" >> /home/test/name.txt $ cat /home/test/name.txt // 查看輸出 zeanzai 方式二: $ mkdir /home/test // 創建文件目錄 $ vi /var/spool/cron/root // 編輯定時任務配置文件,輸入以下內容 # print my name * * * * * echo "zeanzai" >> /home/test/name.txt // 5. 查看定時任務執行的日志 $ tail -f /var/log/cron // 6. 查看定時任務的配置文件 方式一: $ ll /var/spool/cron/ $ cat root 方式二: $ crontab -l // 7. 刪除定時任務 $ crontab -ir yes // 8. 每天00:01打包昨天的日志文件到tar文件,並刪除昨天的日志文件 $ mkdir /home/logs/school-hydroelectricity/tar $ vi /etc/scripts/tar.sh cd /home/logs/school-hydroelectricity tar zcf ./tar/$(date +'%Y-%m-%d' -d '-1 days').tar.gz ./$(date +'%Y-%m-%d' -d '-1 days') rm -rf ./$(date +'%Y-%m-%d' -d '-1 days') $ ./etc/scripts/tar.sh $ crontab -e # 每天00:01打包昨天的日志文件到tar目錄中,並刪除昨天的日志文件,要求打包文件以日期命名 * * * * * /bin/sh /etc/scripts/tar.sh
生產問題案例及解決過程
面試題:維護的時候,創建文件提示”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。
故障原因分析
當系統中crond定時任務執行程序有輸出內容時,輸出內容會以郵件形式發給crond的用戶(默認是root),而sendmail等mail服務沒有啟動時,這些輸出內容以為支在郵件隊列臨時目錄,產生這些碎文件,導致消耗inode數量,一旦inode數量耗盡,就會導致系統無法寫入文件,而報上述錯誤:No space left on device.
亡羊補牢解決方法
-
盡量將crontab里面的命令或腳本中的命令結尾加上>/dev/null 2>&1,或在做定時執行腳本時,把屏幕輸出定向到指定文件里
-
當然也可以開啟郵件服務,不過最好不做,因為郵件服務會帶來安全問題
-
優化系統,加定時清理任務,如find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f
調試crontab定時任務
- 增加執行頻率調試任務
- 調整系統時間調試任務
- 通過日志輸出調試定時任務
- 通過定時任務日志調試定時任務