Linux crontab 定時任務

Mrwhite86 發表於 2021-09-20
Linux

一.cron介紹
linux內建的cron程式能幫我們實現這些需求,cron搭配shell指令碼,非常複雜的指令也沒有問題。
1. var/spool/cron/

目錄下存放的是每個使用者包括root的crontab任務,每個任務以建立者的名字命名
2. _/etc/crontab

這個檔案負責排程各種管理和維護任務。
3. /etc/cron.d/

這個目錄用來存放任何要執行的crontab檔案或指令碼。
我們還可以把指令碼放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目錄中,讓它每小時/天/星期、月執行一次。

 

二.crontab的使用
我們常用的命令如下:
crontab [-u username]    //省略使用者表表示操作當前使用者的crontab
1. -e (編輯工作表)
2. -l (列出工作表裡的命令)
3. -r (刪除工作作)
我們用crontab -e進入當前使用者的工作表編輯,是常見的vim介面。每行是一條命令。
crontab的命令構成為 時間+動作,其時間有分、時、日、月、週五種,操作符有
* 取值範圍內的所有數字
/ 每過多少個數字
- 從X到Z
,雜湊數字

 

三.常見定時任務設定
例項1:每1分鐘執行一次myCommand

* * * * * myCommand

例項2:每小時的第3和第15分鐘執行

3,15 * * * * myCommand

例項3:在上午8點到11點的第3和第15分鐘執行

3,15 8-11 * * * myCommand

例項4:每隔兩天的上午8點到11點的第3和第15分鐘執行

3,15 8-11 */2 * * myCommand

例項5:每週一上午8點到11點的第3和第15分鐘執行

3,15 8-11 * * 1 myCommand

例項6:每晚的21:30重啟smb

30 21 * * * /etc/init.d/smb restart

例項7:每月1、10、22日的4 : 45重啟smb

45 4 1,10,22 * * /etc/init.d/smb restart

例項8:每週六、週日的1 : 10重啟smb

10 1 * * 6,0 /etc/init.d/smb restart

例項9:每天18 : 00至23 : 00之間每隔30分鐘重啟smb

0,30 18-23 * * * /etc/init.d/smb restart

例項10:每星期六的晚上11 : 00 pm重啟smb

0 23 * * 6 /etc/init.d/smb restart

例項11:每一小時重啟smb

0 */1 * * * /etc/init.d/smb restart

例項12:晚上11點到早上7點之間,每隔一小時重啟smb

0 23-7/1 * * * /etc/init.d/smb restart

 

四.例項操作

1.檔案實時寫入:

1) 檢視定時任務狀態

[[email protected] ~]#service crond status
Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-09-20 01:22:18 CST; 24s ago
 Main PID: 17516 (crond)
   CGroup: /system.slice/crond.service
           └─17516 /usr/sbin/crond -n

2) 關閉/開啟定時任務

[[email protected] ~]# service crond stop
Redirecting to /bin/systemctl stop crond.service
[[email protected] ~]# service crond start
Redirecting to /bin/systemctl start crond.service

3) 編輯定時任務

[[email protected] ~]# crontab -e
* * * * * echo `date '+\%Y-\%m-\%d \%H:\%M:\%S'` >> 123.txt #每分鐘執行一次

4) 檢視已存在的定時任務

[[email protected] ~]# crontab -l
* * * * * echo `date '+\%Y-\%m-\%d \%H:\%M:\%S'` >> 123.txt

5) 驗證校驗生成

[[email protected] ~]# cat 123.txt 
2021-09-20 01:13:01
2021-09-20 01:14:01
2021-09-20 01:15:01

2. 定期清理對應目錄下的檔案

1) 預製資料:

[[email protected] test20210920]# echo abcdefg | tee -a file{1..5}.log
abcdefg
[[email protected] test20210920]# du -sh *
4.0K    file1.log
4.0K    file2.log
4.0K    file3.log
4.0K    file4.log
4.0K    file5.log

2) 新增定時任務

[[email protected] ~]# crontab -e

* * * * * find  /root/test20210920  -type f -name '*.log' -exec cp /dev/null {} \;

3) 檢查定時任務執行,1分鐘左右

[[email protected] test20210920]# du -sh *
0    file1.log
0    file2.log
0    file3.log
0    file4.log
0    file5.log

4) 檢視定時任務執行情況:

[[email protected] test20210920]# tail -5 /var/log/cron
Sep 20 01:56:33 localhost crontab[17797]: (root) END EDIT (root)
Sep 20 01:56:51 localhost crontab[17802]: (root) BEGIN EDIT (root)
Sep 20 01:56:54 localhost crontab[17802]: (root) END EDIT (root)
Sep 20 01:57:01 localhost CROND[17809]: (root) CMD (find  /root/test20210920  -type f -name '*.log' -exec cp /dev/null {} \;)
Sep 20 01:58:01 localhost CROND[17819]: (root) CMD (find  /root/test20210920  -type f -name '*.log' -exec cp /dev/null {} \;)

 

五.常見錯誤

1.errors in crontab file, can't install

Linux crontab 定時任務

 解決方式:

因為你的crontab格式錯誤,即沒有按照規則寫

檢視原命令並修正:

echo `date +"%Y-%m-%d %H:%M"` >> 123.txt

修改後正常儲存:

* * * * * echo `date +"%Y-%m-%d %H:%M"` >> 123.txt

 2.接以上錯誤:

郵件內報錯:cat /var/spool/mail/root

Linux crontab 定時任務

解決方式: 

crontab內%需要轉義,修復定時任務正常

* * * * * echo `date '+\%Y-\%m-\%d \%H:\%M:\%S'` >> 123.txt