1、总结Linux系统上的任务计划(at、crontab)的详细使用方法;

Linux的计划任务方式有3种

1.batch:由系统自行选择在资源较为空闲时运行指定的任务,不需要指定时间点,这个不常用,就不多介绍了

2.at:用来在指定时刻一次性执行某个任务

用法:at [option]... TIME

a)输入后会进入at>命令提示符环境,

b)输入需要执行的任务,然后输入ctrl+d表示提交任务

c)最终结果通过邮件发送给用户,可使用mail命令查看,可通过ss -tnl看邮件25端口是否开启

d)TIME,at需要制定执行时间

(1)绝对时间:一下表示方式哦督可以

HH:MM,下一个到达这个时间点的时间

MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY or [CC]YY-MM-DD

tomorrow

(2)相对时间:now+[minute, hour, day, week],表示从此刻起过多长时间

(3)模糊时间:midnight,tomorrow,noon,teatime

示例:

[root@localhost ~]# at now+1minute

at> /bin/echo "hello world"

at> <EOT>

job 4 at Mon Sep 14 22:35:00 2015

[root@localhost ~]# mail

Message  6:

From root@localhost.localdomain  Mon Sep 14 22:31:00 2015

Return-Path: <root@localhost.localdomain>

X-Original-To: root

Delivered-To: root@localhost.localdomain

Subject: Output from your job        3

To: root@localhost.localdomain

Date: Mon, 14 Sep 2015 22:36:00 +0800 (CST)

From: root@localhost.localdomain (root)

Status: RO

hello world


常用选项:

-q QUEUE: at作业队列;标示符为abcdefg,默认为a,可以通过对队列进行分组方便管理

-f /PATH/FROM/SOMEFILE:从指定的文件中读取要运行的作业;

如果直接通过at>输入不能有错别字,因为不能改,所以最好用-f,把要执行的作业写在文档里面,通过-f调用文件里的作业。

由于它会从环境变量中获取,跟你执行at操作的路径不一致,所以建议作业中的执行内容使用绝对路径以免出错

[root@localhost ~]# at -f echo.sh -q b now+1minute  

job 5 at Mon Sep 14 23:21:00 2015

[root@localhost ~]# atq

5       Mon Sep 14 23:21:00 2015 b root

1       Tue Sep 15 10:19:00 2015 a root

-l: 查看作业队列中的等运行作业列表;相当于使用atq命令;

[root@localhost ~]# atq

1       Tue Sep 15 10:19:00 2015 a root

[root@localhost ~]# at -l

1       Tue Sep 15 10:19:00 2015 a root

-c AT_JOB_NUM: 查看待运行作业的内容;

[root@localhost ~]# at -c 6

中间有一堆标明环境变量的东西,显示不好看,我删掉了

${SHELL:-/bin/sh} << 'marcinDELIMITER608226e0'

#!/bin/bash

/bin/echo "hello word"

marcinDELIMITER608226e0


-d: 删除指定作业;相当于atrm,会删除作业同时邮件通知你。

[root@localhost ~]# at -d 1

[root@localhost ~]# at -l

您在 /var/spool/mail/root 中有新邮件


3.crontab:用来运行周期性任务计划

crontab需要使用一个守护进程(crond),始终在后台处于运行状态,当下一个任务时间到达后就通过该服务执行任务。

crontab的任务分2类

系统cron任务:任务是没有默认运行用户身份的,所以需要额外指定运行者。配置文件为/etc/crontab;不建议用!

用户cron任务:由某个用户提交,默认以提交者身份运行,无需额外制定运行者,配置文件为/var/spool/crom/username

任务写在文件中,但是对于普通用户是不可见的,建议使用crontab命令来定义任务

配置文件格式如下,通过crontab -e来编辑:

# 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

crontab总共包含7个字段:

前5个字段:时间点,凡事用*就表示每到这个时间,其中34不会与5同时使用,且其中含有与的关系

*: 对应时间点有效取值范围内的每个时间点;

-: 一个特定连续时间范围, 3-7表示3分钟到7分钟

,:一个离散的时间点, 3,5,7表示第3分钟,第5分钟,第7分钟

/#:有效时间范围内的每多少时间,用于指定频率;*/3表示每3小时一次  1-30/4表示1到30分钟每4分钟一次

user-name: 以哪个用户的身份运行任务,用户cron不需要这个选项。

command to be executed: 要运行任务

5 */3 * * * /bin/echo "hello world"  每3个小时的第5分钟运行一次后面的命令

* */4 * * * /bin/echo "hello world"  表示每4小时的每分钟都运行一次后的命令

5 7 * * 1,5 /bin/echo "hello world"  表示周一到周五每天的7点5分运行一次命令

任务运行完用邮件方式发送给用户,要确认用户有运行这些命令的权限,一定要用绝对路径不然会发生不可预料的情况

如果不知道这个命令的绝对命令可以用which命令查找

可以通过crontab -l 来查看

crontab命令使用方式:crontab [-u user] [-l | -r | -e]

-u user: 不是管理自己的cron任务,而是指定的目标用户的cron任务;仅root拥有管理其它用户的cron任务的权限;默认管理自己的;

crontab -e -u pdu

-l: list,列出任务;

-r: remove, 移除所有任务;

-e: edit,编辑,打开一当前shell会话的默认编辑器来编辑cron任务表;

补充性的工具:anacron:在指定时间点后开机会把之前该运行的任务全部运行一遍

注意以下几点:

(1) 如果不想接收任务执行结果的通知邮件:

COMMAND > /dev/null 成功不发邮件

COMMAND &> /dev/null 不成功也不发邮件

(2) 对于crontab文件来讲,%有特殊功用;如果命令中会出现%, 要记得转义,或者用单引号对其引用;


另外如果定义了cron任务,最终你还是希望能够收到提醒邮件证明你的任务被正常执行或者没被正常执行,这时我们可以改造一下linux里的mail命令让它能够给你的工作邮箱发送邮件,方法如下:

修改/etc/mail.rc,在该文件下加上如下内容

set from=你的邮件地址

set smtp=你的邮件服务器地址,注意必须为公网IP

set smtp-auth-user=你的邮件账号或用户名

set smtp-auth-password=你的邮件密码

set smtp-auth=login

然后在crontab中使用加入mailto命令

MAILTO=你的邮件地址 ;如果后面不跟邮件地址就不会发送邮件

[root@localhost ~]# crontab -l -u pdu 

MAILTO=name@domain.com

1 * * * * /bin/echo "hello word"

20 3 * * 1-6 /bin/cp -a /etc/* /backup/etc-`date +\%F`

30 2 * * 7 /bin/cp -a /etc/fstab /backup/fasb-`date +\%F-\%H-\%M-%S`

0 0 * * *  root /bin/echo "===============================" >> /statistics/meminfo.txt && /bin/cat /proc/meminfo | egrep "^S|^M" >> /statistics/meminfo.txt > /dev/null 2>&1


2、每周一到周六的凌晨3点20分,运行cp命令对/etc/目录进行归档另存,存储位置为/backups/etc-YYYY-MM-DD;

corntab -e -u pdu

[root@localhost ~]# crontab -l -u pdu

20 3 * * 1-6 /bin/cp -a /etc/* /backup/etc-`date +\%F`

3、每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为/backup/fstab-YYYY-MM-DD-hh-mm-ss;

[root@localhost ~]# crontab -l -u pdu                    

30 2 * * 7 /bin/cp -a /etc/fstab /backup/fasb-`date +\%F-\%H-\%M-%S`

4、每天晚上12点,取得/proc/meminfo文件中所有以S或M开头的行,追加至/statistics/meminfo.

txt文件中,且每天的消息之前,要加上类似===============分隔线;

[root@localhost ~]# crontab -l -u pdu

0 0 * * *  root /bin/echo "===============================" >> /statistics/meminfo.txt && /bin/cat /proc/meminfo | egrep "^S|^M" >> /statistics/meminfo.txt > /dev/null 2>&1