Crontab 的使用

劉哇勇發表於2021-04-30

crontab 用於設定定時任務,通過 cat /etc/crontab 可檢視 crontab 示例:

$ cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# 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
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

根據輸出可知,該命令分三部分,

  • * 設定的迴圈週期
  • user-name 指定執行該任務的身份
  • 最後一部分是需要執行的指令碼路徑或具體的命令

身份

期中以什麼身份執行指令碼,可通過 crontab-u 引數指定,

$ sudo crontab -u user001 -e

上述命令將以 user001 的身份建立並執行 job。

也可以直接編輯 /etc/crontab 檔案,該檔案中可指定 username:

1 1 * * * user001 user001 /data/home/user001/test.sh

job 的管理

  • crontab -e: 編輯或建立 job,配合 -u 可操作指定使用者的 job
  • crontab -l: 列出 job,配合 -u 引數可檢視指定使用者的 job
  • crontab -r: 刪除 job 檔案,慎用,沒有確認過程直接就刪了
  • crontab -i: 同 -r,但刪除前會先確認

迴圈週期

5 個 * 的位置分別代表了不同時間單位,由左至右依次為,

  • 分,取值範圍 0 ~ 59
  • 時,0 ~23
  • 天,1 ~ 31
  • 月,1 ~ 12,部分實現支援使用名稱 jan,feb,mar,…
  • 星期,0 ~ 6,其中星期天為 0,部分實際支援使用名稱,sun, mon, tue…

所以如下格式:

30 5 11 12 * echo "hello"

表示 “12 月 11 日的 5:30” 列印 “hello”。

特殊符號

*

期中,* 代表該位置時間單位下所有可取的值,比如第一個位置代表分,指定為 * 時就是每分鐘都執行。

所以五個星 * * * * * 表示每分鐘。

,

指定多個值時用於逗號分隔,

0,15,30 * * * *

表示當時間為 0,15 或 30 分鐘的時候執行。

-

連字元用於指定範圍,

0-15,30 * * * *

表示 0~15 之間的每分鐘,以及第 30 分鐘的時候執行。

/

除號用於設定重複的間隔,

*/15 * * * *

表示每個一刻鐘的時候,即 0,15,30,45 這些時刻。

它與 15 * * * * 的區分是後者表示一個值,即 15min 的時候,13:15, 12:15 這些。

非標準的字串

還有一些方便的預設關鍵字,但這些都是非標準的,不同機器支援情況不同。

EntryDescriptionEquivalent to
@yearly (or @annually) 每年一月午夜 0 0 1 1 *
@monthly 每月首日午夜 0 0 1 * *
@weekly 每週天午夜 0 0 * * 0
@daily (or @midnight) 每天午夜 0 0 * * *
@hourly 每小時 0 * * * *
@reboot 重啟時 N/A

示例:重啟後啟動 redis

@reboot /usr/local/bin/redis-server /path/to/redis.conf

一些示例

每分鐘列印日期到指定檔案,

  • crontab -e 開啟 job 編輯介面
  • 輸入 */1 * * * * date >> /data/home/wayongliu/foo.txt 然後 :wq 儲存退出
  • tail -f /data/home/wayongliu/foo.txt` 檢視結果

實現每隔多少秒執行

因為能設定的最小時間單位為分,需要設定每隔多少秒執行時,就需要變通來實現。

藉助 sleep,可不用 crontab, 比如每 5 秒:

#!/bin/bash
while true
do
 /home/user/myscript.sh
 sleep 5
done

也可以 sleep 與 crontab 結合來用,考慮到每 5 秒,一分鐘內即執行 12 次,可以設定 12 個 job:

* * * * * /home/user/myscript.sh
* * * * * sleep 5; /home/user/myscript.sh
* * * * * sleep 10; /home/user/myscript.sh
* * * * * sleep 15; /home/user/myscript.sh
* * * * * sleep 20; /home/user/myscript.sh
* * * * * sleep 25; /home/user/myscript.sh
* * * * * sleep 30; /home/user/myscript.sh
* * * * * sleep 35; /home/user/myscript.sh
* * * * * sleep 40; /home/user/myscript.sh
* * * * * sleep 45; /home/user/myscript.sh
* * * * * sleep 50; /home/user/myscript.sh
* * * * * sleep 55; /home/user/myscript.sh

其中第一個任務會在每分鐘開始時執行,
第二個也是每分鐘開始執行,不過會 sleep 5s,所以實際是每分鐘每 5s 的時候執行,
後面的任務類似,從而達到了需要的效果。

相關資源

The text was updated successfully, but these errors were encountered:

相關文章