天天看點

Crontab 的使用

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 這些。

非标準的字元串

還有一些友善的預設關鍵字,但這些都是非标準的,不同機器支援情況不同。
Entry Description Equivalent 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 的時候執行,

後面的任務類似,進而達到了需要的效果。

相關資源

  • 線上檢視 crontab 模式對應的執行周期
  • The Ultimate Crontab Cheatsheet
  • How to run a cronjob every X seconds in cron
  • wikipedia - crontab
The text was updated successfully, but these errors were encountered:
Crontab 的使用

CC BY-NC-SA 署名-非商業性使用-相同方式共享