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
可操作指定用戶的 jobcrontab -l
: 列出 job,配合-u
參數可查看指定用戶的 jobcrontab -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: