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 的時候執行,
后面的任務類似,從而達到了需要的效果。

相關資源

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM