Linux 任務計劃、周期性任務執行
未來的某時間點執行一次任務
at
batch :系統 自行選擇空閑時間去執行此處指定的任務
周期性運行某任務
cron
[root@localhost ~]# rpm -q at (CentOS6中使用) at-3.1.10-48.el6.x86_64 [root@localhost ~]# rpm -ql at /etc/at.deny /etc/pam.d/atd /etc/rc.d/init.d/atd /etc/sysconfig/atd /usr/bin/at /usr/bin/atq [root@localhost ~]# runlevel N 5 [root@localhost ~]# chkconfig --list atd 查看開機是否啟動 atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off [root@localhost ~]# service atd status 查看目前啟動狀態 atd (pid 2131) is running... [root@localhost ~]# rpm -q at (CentOS7中使用) at-3.1.13-22.el7.x86_64 [root@localhost ~]# rpm -ql at /etc/at.deny /etc/pam.d/atd /etc/sysconfig/atd /usr/bin/at /usr/bin/atq /usr/bin/atrm /usr/bin/batch /usr/lib/systemd/system/atd.service [root@localhost ~]# systemctl is-enabled atd 查看開機是否啟動 enabled [root@localhost ~]# systemctl st start status stop [root@localhost ~]# systemctl status atd 查看目前啟動狀態 atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2017-05-09 15:58:16 CST; 4h 15min ago
at任務
包:at
at 命令:at [option] TIME
常用 選項:
-V:顯示版本信息:
-l:列出指定隊列中等待運行的作業;相當于atq
-d:刪除指定的作業;相當于atrm
-c:查看具體作業任務
-f /path/from/somefile :從指定的文件中讀取任務
-m: 當任務被完成之后,將給用戶發送郵件,即使沒有標準輸出
注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
[root@localhost ~]# date Tue May 9 20:35:30 CST 2017 [root@localhost ~]# at 20:40 at> ls at> echo uname<EOT> job 6 at Tue May 9 20:40:00 2017 [root@localhost ~]# at -l 6 Tue May 9 20:40:00 2017 a root [root@localhost ~]# ls /var/spool/at/ a00006017c0758 spool [root@localhost ~]# cat /var/spool/at/a00006017c0758 ${SHELL:-/bin/sh} << 'marcinDELIMITER175813cb' ls echo uname marcinDELIMITER175813cb [root@localhost ~]# mail 執行完會給當前用戶發送郵件不會再屏幕顯示 Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 5 messages 1 new 5 unread U 1 user@localhost.local Tue Mar 21 05:25 110/4760 "[abrt] initial-setup-gui: Gio.py:" U 2 root Tue May 9 20:29 16/522 "Output from your job 3" U 3 root Tue May 9 20:30 15/522 "Output from your job 2" U 4 root Tue May 9 20:33 16/520 "Output from your job 4" >N 5 root Tue May 9 20:35 14/506 "Output from your job 5"
刪除任務 [root@localhost ~]# date Tue May 9 22:10:15 CST 2017 [root@localhost ~]# at 22:15 at> echo hostname<EOT> job 8 at Tue May 9 22:15:00 2017 [root@localhost ~]# atq 8 Tue May 9 22:15:00 2017 a root [root@localhost ~]# at -d 8 [root@localhost ~]# atq [root@localhost ~]# [root@localhost ~]#
如果定義的兩個計劃任務時間相同,會同時進行 [root@localhost ~]# date Tue May 9 22:59:47 CST 2017 [root@localhost ~]# at 23:02 at> echo job1<EOT> job 12 at Tue May 9 23:02:00 2017 [root@localhost ~]# at 23:02 at> echo job2<EOT> job 13 at Tue May 9 23:02:00 2017 [root@localhost ~]# at -l 12 Tue May 9 23:02:00 2017 a root 13 Tue May 9 23:02:00 2017 a root [root@localhost ~]# at -m 23:07 at> touch at.log<EOT> job 15 at Tue May 9 23:07:00 2017 [root@localhost ~]# at -l 15 Tue May 9 23:07:00 2017 a root [root@localhost ~]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 10 messages 8 unread U 8 root Tue May 9 23:02 15/512 "Output from your job 12" U 9 root Tue May 9 23:02 15/512 "Output from your job 13" 10 root Tue May 9 23:07 14/508 "Output from your job 15" & 10 Message 10: From root@localhost.localdomain Tue May 9 23:07:00 2017 Return-Path: <root@localhost.localdomain> X-Original-To: root Delivered-To: root@localhost.localdomain Subject: Output from your job 15 To: root@localhost.localdomain Date: Tue, 9 May 2017 23:07:00 +0800 (CST) From: root@localhost.localdomain (root) Status: RO
TIME: 定義出什么時候進行at這項任務的時間
HH:MM [YYYY-mm-dd]
noon, 中午12:00
midnight, 午夜00:00
teatime(4pm) 下午茶16:00
tomorrow 明天
now+#{minutes,hours,days, OR weeks} 現在起(分鐘,小時,天,周)
at時間格式
HH:MM 02:00
在今日的HH:MM進行,若該時刻已過,則明天此時執行任務
HH:MM YYYY-MM-DD 02:00 2016-09-20
規定在某年某月的某一天的特殊時刻進行該項任務
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某個時間點再加幾個時間后才進行該項任務
now + 5 minutes
02pm + 3 days
at 任務
執行方式:1.交互式 2.輸入重定向 3.at -f文件
依賴與atd 服務, 需要啟動才能實現at任務
at 隊列存放在/var/spool/at 目錄中
/etc/at.{allow,deny} 控制用戶是否能執行at任務
白名單:/etc/at.allow默認不存在,只有該文件中的用戶才能執行at命令
優先級高,有此文件,deny無效,只有此文件中的用戶可使用at
黑名單:/etc/at.deny默認存在,拒絕該文件中用戶執行at命令,而沒有在at.deny文件中的使用者則可執行
優先級低,在此文件中的用戶無法使用at,不在此文件的用戶可用at
如果兩個文件都不存在,只有root可以執行at命令
周期性任務計劃cron
相關的程序包:
[root@localhost ~]# runlevel (CentOS6) N 5 [root@localhost ~]# chkconfig --list crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@localhost ~]# service crond status crond (pid 2116) is running... [root@localhost ~]# rpm -ql cronie (CentOS7) /etc/pam.d/crond /etc/sysconfig/crond /usr/bin/crontab /usr/lib/systemd/system/crond.service [root@localhost ~]# rpm -q cronie cronie-1.4.11-14.el7_2.1.x86_64
[root@localhost ~]# systemctl status crond crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2017-05-09 15:58:16 CST; 7h ago
cronie:主程序包,提供crond守護進程及相關輔助工具
[root@localhost ~]# rpm -ql cronie /usr/bin/crontab /usr/lib/systemd/system/crond.service /usr/sbin/crond
cronie-anacron:cronie的補充程序,用于監控cronie任務執行狀況,如cronie 中的任務在過去該運行的時間點未能正常運行,則anacron 會隨后啟動一次此任務
[root@localhost ~]# rpm -ql cronie-anacron /etc/anacrontab /etc/cron.hourly/0anacron /usr/sbin/anacron /usr/share/man/man5/anacrontab.5.gz /usr/share/man/man8/anacron.8.gz /var/spool/anacron /var/spool/anacron/cron.daily /var/spool/anacron/cron.monthly /var/spool/anacron/cron.weekly crontabs:包含CentOS提供系統維護任務 [root@localhost ~]# rpm -ql crontabs /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly /etc/crontab (定義了系統中的計劃任務) /etc/sysconfig/run-parts /usr/bin/run-parts /usr/share/man/man4/crontabs.4.gz /usr/share/man/man4/run-parts.4.gz
計劃任務
確保crond 守護處于運行狀態:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
計劃周期性執行的任務提交給crond ,到指定時間會自動運行
系統cron 任務:系統維護作業
/etc/crontab
用戶cron 任務:
crontab 命令
日志:/var/log/cron
系統cron 任務:/etc/crontab
注釋行以 # 開頭
詳情參見 man 5 crontab
[root@localhost ~]# 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
例如:晚上9 點10 分運行echo 命令;
10 21 * * * centos /bin/echo “Howdy!” (建議跟上路徑)
系統的計劃任務:
/etc/crontab
/etc/cron.d/配置文件
[root@localhost ~]# cd /etc/cron.d [root@localhost cron.d]# ls 0hourly pcp-pmie pcp-pmlogger raid-check sysstat [root@localhost cron.d]# cat 0hourly # Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly
可將計劃任務腳本放于/etc/crontab下以便于管理
/etc/cron.hourly/腳本
[root@localhost cron.hourly]# cat /etc/cron.hourly/0anacron #!/bin/sh # Check whether 0anacron was run today already if test -r /var/spool/anacron/cron.daily; then day=`cat /var/spool/anacron/cron.daily` fi if [ `date +%Y%m%d` = "$day" ]; then exit 0; fi # Do not run jobs when on battery power if test -x /usr/bin/on_ac_power; then /usr/bin/on_ac_power >/dev/null 2>&1 if test $? -eq 1; then exit 0 fi fi
/usr/sbin/anacron -s
/etc/cron.daily/腳本
/etc/cron.weekly/腳本
/etc/cron.monthly/腳本
時間表示法:
(1) 特定值
給定時間點有效取值范圍內的值
(2) *
給定時間點上有效取值范圍內的所有值
表示 “每…”
(3) 離散取值
#,#,#
(4) 連續取值
#-#
(5) 在指定時間范圍上, 定義步長
/#: #即為步長
時間格式
@reboot Run once after reboot. 啟動后執行
例:
@reboot root touch /app/reboot.log
@yearly 0 0 1 1 * 一年執行一次
@annually 0 0 1 1 * 一年執行一次
@monthly 0 0 1 * * 每月幾號
@weekly 0 0 * * 0 每周
@daily 0 0 * * * 每日
@hourly 0 * * * * 每時
示例:每3小時echo和wall 命令
0 */3 * * * centos /bin/echo “howdy!”;/usr/bin/wall“welcome to Magedu!”
anacron系統
運行計算機關機時cron 不運行的任務,CentOS6 以后版本取消anacron 服務,由crond 服務管理
對筆記本電腦、臺式機、工作站、偶爾要關機的服務器及其它不一直開機的系統很重要對很有用
配置文件:
/etc/anacrontab ,負責執行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly 中系統任務。
字段1 :如果在這些日子里沒有運行這些任務……
字段2 :在重新引導后等待這么多分鐘后運行它
字段3 :任務識別器,在日志文件中標識
字段4 :要執行的任務
由/etc/cron.hourly/0anacron執行
當執行任務時,更新/var/spool/anacron/cron.daily文件的時間戳
管理臨時文件
CentOS6 使用/etc/cron.daily/tmpwatch 定時清除臨時文件
[root@localhost ~]# cat /etc/cron.daily/tmpwatch #! /bin/sh flags=-umc /usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \ -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \ -X '/tmp/hsperfdata_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \ -X '/tmp/pymp-*' 10d /tmp /usr/sbin/tmpwatch "$flags" 30d /var/tmp for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do if [ -d "$d" ]; then /usr/sbin/tmpwatch "$flags" -f 30d "$d" fi done
CentOS7 使用systemd-tmpfiles-setup 服務實現
[root@localhost ~]# systemctl status systemd-tmpfiles-setup systemd-tmpfiles-setup.service - Create Volatile Files and Directories Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-setup.service; static; vendor preset: disabled) Active: active (exited) since Tue 2017-05-09 15:57:49 CST; 9h ago Docs: man:tmpfiles.d(5) man:systemd-tmpfiles(8) Main PID: 865 (code=exited, status=0/SUCCESS) CGroup: /system.slice/systemd-tmpfiles-setup.service May 09 15:57:49 localhost.localdomain systemd[1]: Starting Create Volatile Files and Di..... May 09 15:57:49 localhost.localdomain systemd[1]: Started Create Volatile Files and Dir...s. Hint: Some lines were ellipsized, use -l to show in full.
配置文件:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
/tmp 1777 root root 10d
/var/tmp 1777 root root 30d
命令:
systemd-tmpfiles –clean|remove|create configfile
用戶cron:
crontab 命令定義,每個用戶都有專用的cron 任務文件:/var/spool/cron/USERNAME
crontab 命令:
crontab [-u user] [-l | -r | -e] [-i]
-l:列出所有任務;
-e:編輯任務;
-r:移除所有任務;
-i:同 -r 一同使用,以交互式模式移除指定任務
-u user:僅root 可運行,指定用戶管理cron任務
如果誤刪除,可通過/var/log/cron恢復
控制用戶執行計劃任務:
/etc/cron.{allow,deny}
at 和crontab
一次性作業使用 at
重復性作業使用crontab
Create at time crontab -e
List at -l crontab -l
Details at -c jobnum N/A
Remove at -d jobnum crontab -r
Edit N/A crontab -e
沒有被重定向的輸出會被郵寄給用戶
根用戶能夠修改其它用戶的作業
注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
對于cron 任務來講,% 有特殊用途;如果在命令中要使用%,則需要轉義,將%放置于單引號中,則可不用轉義
原創文章,作者:Linux.rookie,如若轉載,請注明出處:http://www.www58058.com/75371