任務計劃分類:
一次性任務計劃:只執行一次就結束 at batch
周期性任務計劃:每隔一定的周期去做相同的事情 cron
作業的執行結果以郵件通知給相關用戶
mail- send and receive internet mail 使用mail命令查看用戶郵件
(1)at命令:
at [option] TIME
option:
-l: 列出指定隊列中等待運行的作業;相當于atq
-d: 刪除指定的作業;相當于atrm
-c: 查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務 -m:當任務被完成之后,將給用戶發送郵件,即使沒有標準輸出
TIME:定義出什么時候進行 at 這項任務的時間
HH:MM [YYYY-mm-dd]
HH:MM 02:00 在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務
HH:MM[am|pm] + number [minutes|hours|days|weeks]
執行方式:
1、交互式2、輸入重定向3、at -f文件
at 交互模式下是不是輸錯一次就要推倒重來
不需要,ctrl+backspace 可以退格
附加知識點:
1、at隊列存放在/var/spool/at目錄中
2、黑白名單
白名單/etc/at.allow默認不存在
黑名單/etc/at.deny默認存在
只要/etc/at.allow存在,則只有該文件中的用戶和root可以執行at命令(此時deny文件可以視為無效)
如果/etc/at.allow不存在,
1)/etc/at.deny存在,只有deny文件中的用戶被拒絕執行at命令
2)/etc/at.deny不存在,只有root用戶可以執行at命令
(2)batch命令:
讓系統自行選擇空閑時間去執行此處指定的任務
(3)cron
相關程序包:cronie,cronie-anacron,crontabs
確保crond守護進程處于運行狀態:
centos 7:systemctl status crond
centos 6:service crond status
3.1系統cron任務
編輯/etc/crontab文件命令格式
# 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
例如:晚上9點10分運行echo命令:
10 21 * * * gentoo /bin/echo “Howdy!”
時間表示法:
1、特定值
給定時間點有效取值范圍內的值
2、*
給定之間點上有效取值范圍內的所有值
3、離散取值:,
#,#,#
4、連續取值:-
#-#
5、在指定時間范圍上,定義步長:
/#:#即為步長
示例:每3小時echo命令:
* */3 * * * gentoo /bin/echo “howdy!”錯誤
較小的時間范圍需要指定特定的時間,否則相當于小時間范圍內全部取值均執行
1 */3 * * * gentoo /bin/echo “howdy!”
@reboot Run once after reboot.
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
注:上面其中表達方式可以用來代替五顆星的位置
3.2用戶cron任務:
crontab命令定義,每個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME
crontab [-u user] [-l|-r|-e] [-i]
-l:列出所有任務
-e:編輯任務
-r:移除所有任務
-i:同-r一同使用,交互式模式讓用戶有選擇地移除指定任務
注:在所有任務中去刪除特定任務,也可以crontab -e打開編輯器,刪除特定行即可
-u user:root用戶專用,代為為指定用戶管理cron任務
at和crontab
一次性作業使用at
重復性作業使用crontab
沒有被重定向的輸出會被郵寄給用戶
根用戶能夠修改其他用戶的作業
注意:
1)運行結果標準輸出和錯誤以郵件通知給相關用戶;
2)對于cron任務來講,%有特殊用途,在命令中要使用%,則需要轉義;單引號隔絕引用,使用單引號不用轉義
練習:
1、每天的2點和12點整,將/etc備份至/testdir/backup目 錄中,保存的文件名稱格式為“etcbak-yyyy-mm-ddHH.tar.xz”
mkdir /testdir/backup crontab -e 0 2,12 * * * /bin/tar -Jcf /testdir/backup/etcbak-`date +'%F'`.tar.xz /etc
2、每周2,4,7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd”
mkdir /logs crontab -e 0 0 * * 2,4,7 /var/log/messages /logs/messages-$(date +'%Y%m%d')
3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
crontab -e 1 */2 * * * /bin/grep -E "^(S|M)" /proc/meminfo >>/meminfo.txt
4、工作日時間內,每小時執行一次“ip addr show”命令
crontab -e 1 * * * 1-5 /sbin/ip addr show
5、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高于80%,就執行wall警報。
cd /bin vim chkdisk.sh block_used=df|grep -E "^/dev/sd"|tr -s " "|cut -d" " -f5|cut -d% -f1 inode_used=df -i|grep -E "^/dev/sd"|tr -s " "|cut -d" " -f5|cut -d% -f1 if [ block_used -gt 80 || inode_used -gt 80 ];then wall disk is full fi chmod +x chkdisk.sh crontab -e */10 * * * * chkdisk.sh
想了一下,這種方法是有缺陷的。當多個磁盤使用率同時超過80%時,無法進行正確的判斷
注意:使用which或者whereis可以查詢命令的絕對路徑,用來幫助寫cron任務計劃。
原創文章,作者:maru,如若轉載,請注明出處:http://www.www58058.com/75070