linux進程管理-定時定期執行任務
0.計劃任務的命令:
at 安排作業在某一時刻執行
batch 安排作業在系統負載不重時執行
crontab 安排周期性運行的作業
1.at命令用法:
安排命令或者多個命令在指定的時間運行一次
語法;
at [-f filename] 時間
at -d or atrm 刪除隊列中的任務
at -l 或者 atq 查看隊列中的任務
1.1 at指定時間的方式(前提是開啟atd服務,所以需要查看系統是否開啟atd服務)
絕對計時方法;
midnight noon teatime
hh:mm[today]
hh:mm tomorrow
hh:mm 星期
hh:mm MM/DD/YY
相對計時方法:
now +n minutes
now +n hours
now +n days
例如:
1.2 at用法:
1.安排定時任務
例如:10分鐘以後發個廣播:
[root@iz2ze46xi6pjjj69ailg9lz ~]# at now +10 minutes #用相對時間 at> /usr/bin/wall < /etc/motd<EOT> #輸入命令之後Ctrl+D保存任務
註意:
(2)能使用at定時任務的前提是開啟atd服務,所以需要查看系統是否開啟atd服務:
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le|grep atd 4 S 0 529 1 0 80 0 - 6460 hrtime ? 00:00:00 atd
2.查看以及刪除定時任務
- 定時任務原理:
我們安排了一個定時任務實際上是將我們的命令保存在/var/spool/at/目錄下面:
[root@iz2ze46xi6pjjj69ailg9lz ~]# ls /var/spool/at/ #查看目錄下文件a0000301832fd6 spool [root@iz2ze46xi6pjjj69ailg9lz ~]# tail -5 /var/spool/at/a0000301832fd6 #查看文件內容 exit 1 } ${SHELL:-/bin/sh} << ‘marcinDELIMITER2474a99d‘ /usr/bin/wall < /etc/motd marcinDELIMITER2474a99d
我們發現linux實際上將我們的定時任務放在文件末尾,在前面做了一系列的讀取環境變量的操作,也就是我們的定時任務是在文件的末尾寫著的。
- 查看與刪除定時任務:
[root@iz2ze46xi6pjjj69ailg9lz ~]# atq [root@iz2ze46xi6pjjj69ailg9lz ~]# at now +5 minutes #新增一個任務 at> /usr/bin/wall gggg<EOT> job 4 at Sat Mar 31 15:23:00 2018 [root@iz2ze46xi6pjjj69ailg9lz ~]# at now +10 minutes #新增一個任務 at> /usr/bin/wall secondwall<EOT> job 5 at Sat Mar 31 15:29:00 2018 [root@iz2ze46xi6pjjj69ailg9lz ~]# atq #查看定時任務 5 Sat Mar 31 15:29:00 2018 a root 4 Sat Mar 31 15:23:00 2018 a root [root@iz2ze46xi6pjjj69ailg9lz ~]# at -l #查看任務方法二 5 Sat Mar 31 15:29:00 2018 a root 4 Sat Mar 31 15:23:00 2018 a root [root@iz2ze46xi6pjjj69ailg9lz ~]# at -d 5 #移除序號是5的任務 [root@iz2ze46xi6pjjj69ailg9lz ~]# atq 4 Sat Mar 31 15:23:00 2018 a root [root@iz2ze46xi6pjjj69ailg9lz ~]# atrm 4 #移除序號是4的任務
3.at配置文件限制哪些用戶可以使用at命令:
/etc/at.allow
/etc/at.deny
規則:
如果/etc/at.allow文件存在,那麽只有列在此文件中的用戶才可以使用at命令;
如果/etc/at.deny文件存在,那麽只有列在此文件中的用戶才不可以使用at命令;
如果兩個文件都不存在,那麽只有超級用戶才可以使用at命令;
如果兩個文件都存在且都為空,那麽所有人可以使用at命令。
2.batch命令用法:
用法與功能與at一樣,只是它會檢查系統負載值,負載較輕才會執行任務(一般為0.8以下為較輕)。負載值就是我們用w或top查詢時候的load average。
3.crontab周期性執行命令的用法:(依賴於crond進程)
作用:用於生成cron進程所需要的crontab文件
語法:
crontab {-l | -e|-r}
-l 顯示當前的crontab
-r 刪除當前的crontab
-e 使用編輯器編輯當前的crontab文件
crontab -e格式: (時間值的填寫方法:將知道的時間值填上,不知道的寫上*。)
分鐘 小時 天 月 星期 命令/腳本
例如:
(1)每天淩晨四點備份文件:
0 4 * * * 備份腳本
(2)每個星期二和星期五下午六點備份文件
0 18 * * 2,5 備份腳本
(3)一月到三月的星期2和星期五備份文件
0 18 * 1-3 2,5 備份腳本
(4)另一個需求,星期一到星期五的17.30發一條廣播,17.45所有電腦自動關機
30 17 * * 1-5 /usr/bin/wall < news.txt
45 17 * * 1-5 /sbin/shutdown -h now
(5)3-6月和9-12月每個星期的星期1到星期5的12點到下午2點每隔2分鐘執行一次備份腳本
*/2 12-14 * 3-6,9-12 1-5 /bin/cp /root/data/ -r /root/data.bak 2> /root/bak.err
上面將錯誤的信息重定向到/root/bak.err文件夾中
總結:時間範圍用-,多個時間用,逗號隔開,沒兩分鐘可以在分鐘處*/2,每兩小時在天的位置*/2.
總結:
(1)這些選項都不能為空,必須填入
(2)如果不知道具體的值用*代替
(3)每個時間段可以指定多個值,用逗號隔開;時間範圍的話用-
(4)命令應該給出絕對路徑
(5)用戶必須具有運行所對應的命令或程序的權限。
1.周期性任務的例子:
(1)每隔3分鐘發送一條廣播,內容從news.txt讀取
[root@iz2ze46xi6pjjj69ailg9lz ~]# crontab -e
輸入內容如下,輸入完成之後保存即可:
*/3 * * * 6 /usr/bin/wall < /root/news.txt
保存之後可以到/var/spool/cron/目錄下查看
[root@iz2ze46xi6pjjj69ailg9lz cron]# pwd /var/spool/cron [root@iz2ze46xi6pjjj69ailg9lz cron]# cat root */3 * * * 6 /usr/bin/wall < /root/news.txt
定時執行的原理:
將我們寫的命令保存到/var/spool/cron/目錄下,以用戶命名,然後定期執行文件,我們也可以手工編輯這個文件。
(2)其他例子:
2.查看周期性任務的兩種方式:
[root@iz2ze46xi6pjjj69ailg9lz cron]# cat /var/spool/cron/root #直接讀取文件 */3 * * * 6 /usr/bin/wall < /root/news.txt */1 * * * * /usr/bin/ls [root@iz2ze46xi6pjjj69ailg9lz cron]# crontab -l #用crontab命令讀取 */3 * * * 6 /usr/bin/wall < /root/news.txt */1 * * * * /usr/bin/ls [root@iz2ze46xi6pjjj69ailg9lz cron]#
3.刪除周期性任務的兩種方式
第一種:直接刪除所有的任務
[root@iz2ze46xi6pjjj69ailg9lz cron]# crontab -r [root@iz2ze46xi6pjjj69ailg9lz cron]# crontab -l no crontab for root
第二種:編輯/var/spool/cron/root文件,刪除指定行也就完成了刪除任務
註意:crond周期執行任務依賴於crond進程,因此需要開啟crond進程:
[root@iz2ze46xi6pjjj69ailg9lz ~]# pkill crond #殺掉進程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep crond [root@iz2ze46xi6pjjj69ailg9lz ~]# which crond /usr/sbin/crond [root@iz2ze46xi6pjjj69ailg9lz ~]# crond #開啟crond進程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep crond 1 S 0 22973 1 0 80 0 - 31554 hrtime ? 00:00:00 crond
4.crontab的配置文件: /etc/crontab文件 介紹了配置文件的格式
[root@iz2ze46xi6pjjj69ailg9lz /]# cat /etc/crontab #查看/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,f ri,sat # | | | | | # * * * * * user-name command to be executed 0 */6 * * * root /bin/wipefs
5. /etc/下面有每周、每天和每日執行的腳本文件夾,我們將一個腳本放進去即可實現對應的執行腳本:
[root@iz2ze46xi6pjjj69ailg9lz etc]# ll /etc/ | grep cron -rw-------. 1 root root 541 Mar 31 2016 anacrontab drwxr-xr-x. 2 root root 4096 Aug 18 2017 cron.d drwxr-xr-x. 2 root root 4096 Aug 18 2017 cron.daily -rw-------. 1 root root 0 Mar 31 2016 cron.deny drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.hourly drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.monthly -rw-r--r--. 1 root root 480 Jan 21 08:26 crontab drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.weekly
centos7,調用執行上面每日、每月、每周文件夾下面的腳本是在:/etc/anacrontab通過anacron在調用
[root@iz2ze46xi6pjjj69ailg9lz etc]# cat /etc/anacrontab # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
6.限定哪些用戶可以使用crond命令:
/etc/cron.allow
/etc/cron.deny
規則:
如果/etc/cron.allow文件存在,那麽只有列在此文件中的用戶才可以使用at命令;
如果/etc/cron.deny文件存在,那麽只有列在此文件中的用戶才不可以使用at命令;
如果兩個文件都不存在,那麽只有超級用戶才可以使用at命令;
如果兩個文件都存在且都為空,那麽所有人可以使用at命令。
linux進程管理-定時定期執行任務