首頁 > 軟體

踩坑記錄之crontab每10秒執行一次問題

2023-04-08 06:02:16

crontab每10秒執行一次問題

需求:linux中使用crontab每十秒執行一次

場景:需要在ubuntu14伺服器中使用代理每十秒執行一次curl來存取網際網路,來測試代理網路穩定性。

經過網上的大量搜貼之後得到的可用的一個結論如下:

# crontab -e
* * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 10; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 20; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 30; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 40; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 50; /usr/local/cc.sh >>/usr/local/log.txt 2>&1

如果你是直接一梭子全複製,改下目錄那麼恭喜你完成了計劃任務。而我就不是了,我只寫了sleep 10 這條然後任務沒有執行。這就是坑。

坑1 .上面sleep 10 20 30 ...是啥意思啊,怎麼個規則啊。一頭霧水,當時我是直接把第二個sleep 10 那個定時任務直接粘進去的。然後,任務沒有執行就一直糾結任務沒有執行這個問題。

坑2.ubuntu系統第一次使用crontab -e 需要選擇比編輯器,如果選nano上,對我這種小白可就蒙圈。最後在命令列使用, select-ediort 來選擇編輯器選3 vim 就好了

後來,明白後做了實驗。

如果只寫前兩條的話是:在每分鐘的第一秒和第一個10秒執行一次

 * * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1
 * * * * * sleep 10; /usr/local/cc.sh >>/usr/local/log.txt 2>&1

以此類推只寫前三的話就是:

在每分鐘的第一、第一個十秒、第二個十秒分別執行一次

* * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 10; /usr/local/cc.sh >>/usr/local/log.txt 2>&1
* * * * * sleep 20; /usr/local/cc.sh >>/usr/local/log.txt 2>&1

如果都寫上的話就是每十秒執行一次啦,完美過程

過程遇到的問題(1):crontab -e 完都有新郵件

原因:

1.crontab 每次執行完程式產生的輸出都會發郵件到/var/mail/root

2.定時任務語法有誤,/var/mail/root  傳送的是錯誤紀錄檔,如下

root@bogon:/usr/local# tail -20 /var/mail/root  

From root@bogon Tue May 21 18:31:11 2019Return-Path: <root@bogon>X-Original-To: rootDelivered-To: root@bogonReceived: by bogon (Postfix, from userid 0) id AAFCB43077; Tue, 21 May 2019 18:31:11 +0800 (CST)From: root@bogon (Cron Daemon)To: root@bogonSubject: Cron <root@bogon> sleep 10; sh /home/liuxin/curl-status.sh >dev/null 2>&1Content-Type: text/plain; charset=ANSI_X3.4-1968X-Cron-Env: <SHELL=/bin/sh>X-Cron-Env: <HOME=/root>X-Cron-Env: <PATH=/usr/bin:/bin>X-Cron-Env: <LOGNAME=root>Message-Id: <20190521103111.AAFCB43077@bogon>Date: Tue, 21 May 2019 18:31:11 +0800 (CST) /bin/sh: 1: cannot create dev/null: Directory nonexistent

解決:

如果是1的話就放到黑洞  >/dev/null 2>&1

* * * * * /usr/local/cc.sh >/dev/null 2>&1

精講:

1,/dev/null是linux系統的一個垃圾桶(一個不正經的比喻)有不用的輸出都可以往裡面扔。>/dev/null 預設預設是1 即 1>/dev/null    

2,linux中有三種標準輸入輸出,分別是STDIN,STDOUT,STDERR,對應的數位是0,1,2    2>&1就是把2錯誤輸出重定向到1標準輸出  而1又輸出到/dev/null黑洞

如果不想輸出到一個檔案可以這樣寫

* * * * * /usr/local/cc.sh >>/usr/local/log.txt 2>&1

過程中遇到的問題(2):如圖crontab -e 後是新檔案

解決:crontab語法錯誤再三檢查後,建議select-editor 選3  vim

linux crontab使用技巧

crontab命令主要用於設定命令列或者指令碼週期性的執行。該命令從標準輸入裝置讀取指令,並將其存放於檔案中,以供之後讀取和執行。

主要講述crontb命令的基本語法和設定方法。

crontab命令格式

crontab [-u user] -e -l -r
  • -u 使用者名稱,不加-u引數預設為當前使用者。
  • -e 編輯crontab檔案。
  • -l 列出crontab檔案中的內容。取值來源為/var/spool/cron下對應的檔案
  • -r 刪除crontab檔案。

crontab命令格式

# Example of job definition:
 .---------------- minute (0 - 59)
 |  .------------- hour (0 - 23)
 |  |  .---------- day of month (1 - 31)
 |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
 |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
 |  |  |  |  |
 *  *  *  *  * command/script

一個定時任務的設定共包括6個欄位,分別是分、時、日、月、周、命令列或指令碼,每一列取值的範圍或者含義如上述格式中註釋描述。

特別注意一點是命令列或者指令碼一定要設定成絕對路徑。

特殊欄位說明

  • 星號(*):代表所有可能的值,例如在第1列表示每分鐘執行,第2列表示每小時執行,第3列表示每天執行。
  • 逗號(,):可以用逗號隔開的值表示指定一個列表範圍,例如,在第1列設定15,30,45表示在第15分鐘、30分鐘、45分鐘執行。
  • 中槓(-):可以用整數之間的中槓表示一個整數範圍,例如"2-6"表示2,3,4,5,6
  • 正斜線(/):可以用正斜線指定時間的間隔頻率,例如第2列設定成"*/2",表示每兩小時執行一次。

每天晚上10點執行rumenz.sh指令碼

0 22 * * * /root/rumenz.sh

每月的1,3,7的早上8.30執行rumenz.sh

> 30 8 1,3,7 * * /root/rumenz.sh

每週六,日的的凌晨2點執行rumenz.sh

> 0 2 * * 6,0 /root/rumenz.txt

每天的的18點到23點每30分執行rumenz.sh

0,30 18-23 * * /root/rumenz.sh

//或者

*/30 18-23 * * /root/rumenz.sh

每天凌晨2點存取一個網址

> 0 2 * * * /usr/bin/curl https://rumenz.com

crontab每10秒執行一次rumenz.sh

* * * * * /root/rumenz.sh
* * * * * sleep 10;/root/rumenz.sh
* * * * * sleep 20;/root/rumenz.sh
* * * * * sleep 30;/root/rumenz.sh
* * * * * sleep 40;/root/rumenz.sh
* * * * * sleep 50;/root/rumenz.sh

每 90 分鐘執行一次rumenz.sh

0 0-21/3 * * * /root/rumenz.sh
30 0-22/3 * * * /root/rumenz.sh

需要兩個表示式實現

每90秒執行一次rumenz.sh

*/3 * * * * /root/rumenz.sh
*/3 * * * * sleep 90;/root/rumenz.sh

需要兩個表示式實現

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com