1. 程式人生 > >linux進程管理-定時定期執行任務

linux進程管理-定時定期執行任務

dai clas XA 自動 c99 post 定時執行 shell 文件

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保存任務

註意:

  

(1)命令要用絕對路徑。

  (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進程管理-定時定期執行任務