cron 工具 每分钟_计划任务 cron和crontab
很多時候,我們需要定時執行某個應用或者某段腳本,在linux上,可以使用cron服務,它有點類似于Windows上的任務計劃程序。這篇文章將簡單介紹cron的使用。
1. crond和crontab
首先需要分清楚兩個概念:crond和crontab。crond是后臺守護進程的名稱(d代表daemon),用來實際執行腳本,它在系統中是一直運行的。可以通過下面的方式查看到它:
# systemctl | grep crond
crond.service loaded active running Command Schedulercrontab是一個工具,用來列出cron中當前運行的作業(應用或腳本等)、向cron中添加作業、編輯作業、刪除作業。它并不是一直在后臺運行的,是一個短時的命令行工具,執行完就結束了。可以簡單理解crond和crontab組合起來提供cron服務。
2. crontab的常用命令
因為crond是一個守護進程,所以在系統開機后,通過systemctl start crond啟動一次以后(默認自動啟動的),幾乎就不需要再管它了,之后的操作都通過crontab來完成。
2.1 查看現有任務
# crontab -l
no crontab for root因為現在沒有任務,所以顯示的是 no crontab for root,可見,任務是根據用戶進行區分的。
2.2 添加定時任務
為了便于測試,我們可以創建這樣一個簡單的腳本(位于~/tmp/job1.sh):在一個文件末尾追加當前時間。腳本如下:
date +'%F %T' >> ~/tmp/job1.log創建完成后記得賦予一下執行權限:
# chmod 755 job1.sh接下來,需要配置多久運行一次。這里通過cron表達式來設置,它非常靈活,可以很簡單也可以很復雜。cron表達式的應用廣泛,不止用在系統層面,在其他各種編程語言的類庫當中,都有類似的實現,語法略有不同。使用下面的命令可以查看linux系統中cron表達式的寫法:
# 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如果需要查看更詳細的用法,可以使用?# man crontab?命令查看。
整理后如下表所示:
注意:不同的cron應用存在很大差異,比如crontab不支持“秒”,特殊字符也支持的比較少(支持,-*/)。而其他一些應用,則支持“秒”和更多的特殊字符。這里為了更完備一些,所以全都列出來了,省的以后再去總結。
| 名稱 | 必須 | 取值范圍 | 可設置的特殊字符 |
|---|---|---|---|
| 分 | 是 | 0-59 | ,-*/ |
| 時 | 是 | 0-23 | ,-*/ |
| 日(月) | 是 | 1-31 | ,-*?/LW |
| 月 | 是 | 1-12 或者 jan-dec | ,-*/ |
| 日(周) | 是 | 0-7(0和7都是星期天) 或者 sun-sat | ,-*?/L# |
| 年 | 否 | 留空,1970-2099 | ,-*/ |
幾個特殊字符的含義:
| 字符 | 含義 |
|---|---|
| * | 全部。意思是在該時間的任意點都應當執行 |
| ? | 不指定,任意。僅用于 日(月)和日(周)。0 0 5 * ? 代表每個月的第5天零點,不論星期幾。 0 0 ? * 1 代表每周一,不論是當月的哪天。 |
| , | 多個值的分隔符,例如1,5,10 |
| - | 代表連續值,例如1-20 |
| / | 步長。例如 5/15,代表從5開始,以15為步長。因此,當5/15位于分鐘的位置時,表示小時內的第5、20、35和50分鐘。 |
| L | 最后一天。可以是每月最后一天或者每周最后一天。如果用在 天(周)字段,并且前面加數字,則表示最后一個周N。例如5L,表示最后一個周五(5表示周五,L表示最后)。 |
| W | 工作日,指周一到周五的任意一天 |
| # | 表示第幾個的意思,例如 6#3,表示當月第3個星期六(6表示周六,3表示第3個) |
幾個簡單的例子:
| 表達式 | 含義 |
|---|---|
| * * * * * | 每分鐘執行一次 |
| 30 * * * * | 每小時的30分執行一次 |
| */5 * * * * | 每5分鐘執行一次 |
| 0/5 * * * * | 每5分鐘執行一次,且僅在0,5,15,20...55分執行 |
| 5 0 * * * | 每天的00:05執行一次 |
注意:crontab中 日(周)不接受“?”的寫法,在很多其他應用中則可以,例如Quartz.Net庫:https://www.quartz-scheduler.net/
提示:更多的用法,可以參考:https://crontab.guru
接下來,如果我們想要每分鐘執行一下前面創建的job1.sh腳本,需要再創建一個crontab作業(jobs.cron,后綴名無所謂,這里只是為了便于識別),其中包含了cron表達式,用于表明job1.sh執行的周期:
* * * * * ~/tmp/job1.sh使用crontab將它加入到計劃中:
# crontab jobs.cron再次查看當前計劃,可以看到這樣的結果:
# crontab -l
* * * * * ~/tmp/job1.sh2.3 刪除定時任務
先將job1.sh復制一份,稍作修改,然后編輯一下jobs.cron,將job2.sh也加入進去:
* * * * * ~/tmp/job1.sh
*/5 * * * * ~/tmp/job2.sh然后重新加入到cron服務中。
# crontab jobs.cron接著查看一下當前cron中的作業:
# crontab -l
* * * * * ~/tmp/job1.sh
*/5 * * * * ~/tmp/job2.sh可以看到上面有job1.sh和job2.sh兩個作業,其效果相當于將jobs.cron文件的內容拷貝進去。
如果想要刪除作業,則執行:
# crontab -r這樣會刪除所有作業,如果只想刪除一個,或者想對作業進行編輯,可以使用下面的命令。
2.4 編輯定時任務
crontab -e?命令會調用編輯器(通常是vi或者vim),直接編輯計劃作業,相當于編輯jobs.cron。只不過編輯完立即生效,不需要再執行crontab進行加載。
# crontab -e
crontab: installing new crontab統一期間,個人不建議使用crontab -e編輯計劃,而是編輯jobs.cron,然后進行加載。這樣的話jobs.cron文件相當于一個備份,方便日后恢復。
3. 查看作業日志
在作業執行出現異常(或作業腳本寫日志)時,cron服務會輸出日志,在我的CentOS7系統上,查看的地址位于/var/log下。
# ls /var/log | grep cron
cron
cron-20180819
cron-20180826
cron-20180902
cron-20180909如果想讓自己編寫的作業輸出日志,可以這樣編寫jobs.cron:
* * * * * ~/tmp/job1.sh >> /var/log/job1.log 2>&1上面的意思是將stdout和stderr輸出到/var/log/job1.log。
修改job1.sh,在底部加入echo hello。然后調用crontab jobs.cron重新加載,然后在/var/log目錄下可以看到job1.log,其中包含了輸出的文本“hello”。
至此,我們已經熟悉了cron相關的概念,并完成了常見的添加、刪除、編輯操作,且學會了如何查看和輸出作業日志。
轉載:http://www.tracefact.net/tech/080.html----------END----------
總結
以上是生活随笔為你收集整理的cron 工具 每分钟_计划任务 cron和crontab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷天幕水极几点开始
- 下一篇: 五连阳回调买入法_“4连阳+1阴”这种股