云计算 Android 开源 微软 Firefox Python php mysql google Windows wordpress centos linux shell nginx java 编程 Ubuntu apache 程序员

Linux基礎知識—計劃任務

  • 計劃任務

        所謂的計劃任務是在未來某一特定的時間執行一次或多次特定的作業(任務)。實現無需人工幹預的情況下執行作業。

    一、計劃任務的分類

        根據計劃任務在未來被執行的次數,分為一次性計劃任務和周期性計劃任務。

        一次性計劃任務:只在未來的某一時間執行一次。

        周期性計劃任務:在未來某一特定時間內循環執行多次。

    二、一次性計劃任務

        一次性計劃任務常用的命令有at,batch

    1、設定一次性計劃任務

    1)at命令設定一次性計劃任務,它是由atd後臺進程管理的。要想設置一次性任務需啟動atd服務進程。在CentOS中通過/etc/init.d/atd start 命令來啟動此服務。    

        在命令行下:

    at time

    at> COMMAND1

    at> COMMAND2

    ...

    at> 

    Ctrl+d:提交任务

    TMIE支持的格式有:

格式 示例
HH:MM 13:12
MMDDYY MM/dd/YY  DD.MM.YY  YYYY-MM-DD 030914 03/09/14 09.03.14 2014-03-09
AM PM 4am 3pm
特定字符 + 

now noon midnight teatime

+{minutes|hours|days|weeks}

组合使用

now + 3min

4pm + 1days

teatime + 3hours 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

[root@server ~]# at now + 10min

at> ls /etc/passwd

at> cat /etc/issue

at> date +%F-%D

at> <EOT>

job 4 at 2014-07-12 11:33

[root@server ~]# at 2pm

at> ls /etc/passwd

at> <EOT>

job 5 at 2014-07-12 14:00

[root@server ~]atq

4   2014-07-12 11:33 a root

5   2014-07-12 14:00 a root

[root@server ~]# at 17:00

at> date

at> <EOT>

job 6 at 2014-07-12 17:00

    at是通过作业队列来管理的,通过at后者at -l命令查看作业队列

1

2

3

4

[root@server ~]# atq

6   2014-07-12 17:00 a root #前面的数字是作业的ID号,删除作业的时候可以用到

8   2014-07-12 11:31 a root

5   2014-07-12 14:00 a root

    删除不想执行的任务 at -d 作业ID 或者 atrm 作业ID

1

2

3

4

5

6

7

[root@server ~]# atq

6   2014-07-12 17:00 a root

5   2014-07-12 14:00 a root

[root@server ~]# atrm 6

[root@server ~]# atq

5   2014-07-12 14:00 a root

[root@server ~]#

    作業執行完以後,是以本地郵件的方式通知作業的提交者。

    可以通過/etc/at.allow和/etc/at.deny 2個文件來控制用戶是否可以使用at來設置一次性任務。

2)batch功能同at,但相比於at而言,無需指定其特定的時間。系統會選擇系統資源比較空閑的時候執行指定的作業。

1

2

3

4

5

6

[root@server ~]# batch 

at> ls .

at> <EOT>

job 12 at 2014-07-12 11:42

You have mail in /var/spool/mail/root

#它立即就執行了,因為現在就是系統空閑的時候。

二、周期性任務

    周期性任務是在未來某一特定的時間內循環執行特定的作業。是通過cron機制來完成相應功能的。是由後臺進程crond一直在監控。

    通過“/etc/init.d/crond status”命令語句來查看crond的狀態,如果狀態是“is stopped.”,需要啟動此服務,執行“/etc/init.d/crond start;chkconfig crond on”。

    /etc/init.d/crond status    查看crond的狀態

    /etc/init.d/crond stop    關閉crond服務

    /etc/init.d/crond start    打開crond服務

1、cron任務分類

    根據cron任務的執行者不同,將cron分為兩類:

系統cron

        定義在/etc/crontab中,每行定義一個獨立的任務,這是針對於系統級的。

用戶cron

        定義在/var/spool/cron目錄中,每個用戶都有一個與用戶名同名的文件,其功能類似於/etc/crontab,每行定義一個獨立的任務。這是針對於用戶級別的。

2、相關目錄和文件

    /etc/cron.hourly/ 每個小時要執行的腳本的目錄

    /ect/cron.daily/  每個天要執行的腳本的目錄

    /etc/cron.monthly/  每個月要執行的腳本的目錄

    /etc/cron.weekly/   每個周要執行的腳本的目錄

    /etc/cron.deny   只有cron.allow文件中列出的用戶才能使用cron服務,同時忽略cron.deny文件

    /etc/cron.allow 如果cron.allow文件不存在,cron.deny文件中列出的用戶將被禁止使用cron服務

3、周期性任務的設定

    周期性任務的環境變量和設定格式:

環境變量:

    Shell=/bin/bash #默認shell解釋器

    PATH=/sbin:/bin:/usr/sbin:/usr/bin #默認環境PATH的路徑,所以在設定周期性任務的話有時要寫全腳本的路徑

    MAILTO=root #如果出現錯誤,或者有數據輸出,數據作為郵件發給這個帳號

    HOME=/ #默認的家目錄

格式:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# .---------------- 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

#主要有3部分組成,第一部分 * * * * * 所代表的時間是:minute hour day month day

# * * * * *   每分鐘 

# 2 */2 * * * 每隔2小時  */#:在對應的時間位的有效取值上每#一次

# 3 4 * * 1,3,5 每周1,3,5    ','代表離散取值

# 3 9-17 * * * 每天9-17'-'某個時間位上的連續區間

#註意:在設置時間是,比它小單位一般都是確定的

#第二部分是:user-name 用戶名,這一部分在編輯/etc/crontab設定周期性任務時,需要指定用戶名。其他兩中方式不需要

#第三部分是 command to be executed 可執行的命令或者是腳本。如果有run-parts關鍵字,後面是腳本所在的目錄

#1 * * * * root run-parts /etc/cron.hourly/

    設定周期性任務的方式有三種:

    1)通過crontab命令

        crontab [-u USER_NAME] -e

        此時會打開一個編輯器,按照相應的格式就可以設定。

    2)通過編輯/var/soop/USER_NAME文件設定

    3)通過編輯/etc/crontab文件設定

4、丟棄郵件通知:

    使用輸出重定向:

    &>/dev/null 

    >/dev/null

5、crontab命令其他常用用法

    -l: 列出已經定義的所有任務

    -e: 打開編輯界面定義任務

    -r: 移除所有任務 如果是要刪除某一條特定的任務,可以通過設定周期任務的三種方式來刪除對應任務所在的那一行。

6、其他

    anacron: crontab的補充機制

檢查有沒有過去一個有效周期未曾執行的任務,如果有,在開機後的指定時間點執行一次;

    實現秒級別的任務:

* * * * * for i in {1..5};do 腳本;sleep 10;done (每隔10秒)

7、練習

    1、每月執行一次對/目錄的備份,備份至/backup目錄中,保存的目錄名格式為rootfs-2014-07;

        # 0 4 1 * * [ -d /backup ] || mkdir /backup; /bin/cp -a / /backup/etc-$(date +'%Y-%m')

    2、每周3,5,7備份/proc/cpuinfo文件至/backup/cpu.info/目錄中,保存的文件名為cpu-2013081009;

        # 3 1 * * 3,5,7 [ -d /backup/cpu.info/ ] || mkdir -p /backup/cpu.info/; /bin/cp -a /proc/cpuinfo /backup/cpu.info/cpu-$(date +'%Y%m%d%H')

    3、每天每兩小時取當前系統/proc/meminfo中的以S開頭的信息保存至/stats/memory.txt中

        # 2 */2 * * * grep -i "^S" /proc/meminfo >> /stats/memory.txt 

    4、工作日的工作時間內,每小時執行一次'echo "hello"'

        # 1 9-17 * * 1-5 echo "hello"

延伸阅读

评论