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

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"

延伸阅读

    评论