任务计划 在未来时间点一次性执行某任务: at, batch 周期性执行某任务: crontab 电子邮件服务 smtp: Simple Mail Transfer Protocol P
任务计划
- 在未来时间点一次性执行某任务: at, batch
- 周期性执行某任务: crontab
电子邮件服务
- smtp: Simple Mail Transfer Protocol
- POP3: Post Office Protocol – Version 3
- imap4: Internet Message Access Protocol 4 交互式数据消息访问协议第四个版本
- 邮件用户代理(MUA,Mail User Agent)(mail,mailx)
- 邮件传送代理(MTA,Mail Transport Agent)(sendmail)
- 邮件分发代理(MDA,Mail Deliver Agent)
- 通俗的说MUA就是用户使用的客户端,而MTA则是真正发送邮件的发送进程,MUA编写的邮件最终也交由MTA发送至目标端。
- mail和mailx即为负责查看、编写邮件和向MTA发送邮件的MUA。mailx是mail的功能加强版。
- sendmail即为负责邮件在网络上传输的MTA,将邮件从一个MTA传送至另一个MTA。
linux中mail的存放路径 /var/sool/mail/USERNAME
相关命令
mailx
mailx – 发送和接收 Internet 邮件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
## SYNOPSIS mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops] [-A account] to-addr . . . mailx [-BDdeEHiInNRv~] [-T name] [-A account] [-S variable[=value]] -f [name] mailx [-BDdeEinNRv~] [-A account] [-S variable[=value]] [-u user]
## -s subject //指定邮件的主题,有空格需要引号引起来 $ mailx -s 'hello mailx' root@localhost # 进入交互式收发邮件接口 hello new world. ... #CTRL+D (保存退出)
$ mailx --> Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 3 messages 1 new 2 unread U 1 [email protected] Wed Aug 19 23:07 709/52085 "[abrt] full crash report" 2 root Wed Sep 9 22:55 19/619 "hello mailx" >N 3 root Wed Sep 9 23:01 18/629 "hello mailx" &(此处键入编号查看邮件内容) &(输入quit退出)
$ mailx -s 'hello mailx' root@localhost < cat /PATH/FROM/SOMEFILE $ COMMAND | mailx -s 'hello mailx' root@localhost
|
at
at – 在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程,支持使用作业队列,默认使用a队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
## SYNOPSIS at [OPTION]... TIME
## 常用参数 -m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出 -l atq的别名 -d atrm的别名 -v 显示任务将被执行的时间 -c 打印任务的内容到标准输出 -V 显示版本信息 -q<列队> 使用指定的列队 -f<文件> 从指定文件读入任务而不是从标准输入读入 -t<时间参数> 以时间参数的形式提交要运行的任务
## 操作实践 $ at now+3minutes at> cat /etc/passwd <CTRL+D>
$ atq --> 1 Thu Sep 10 00:00:00 2015 a centos 2 Wed Sep 9 23:38:00 2015 a admin
#1 三天后的下午 5 点钟执行 /bin/ls $ at 5pm + 3days at> /bin/ls <CTRL+D>
#2 明天17点钟,输出时间到指定文件内 $ at 17:00 tomorrow at> date > /tmp/date.log <CTRL+D>
#3 计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务 $ atq --> 1 Thu Sep 10 00:00:00 2015 a centos 3 Thu Sep 10 12:00:00 2015 a root 4 Thu Sep 10 16:00:00 2015 a root 5 Thu Sep 10 17:00:00 2015 a root
#4 删除已经设置的任务 $ atrm 5 $ atq --> 1 Thu Sep 10 00:00:00 2015 a centos 3 Thu Sep 10 12:00:00 2015 a root 4 Thu Sep 10 16:00:00 2015 a root
#5 显示已经设置的任务内容 $ at -c 1 --> #!/bin/sh # atrun uid=1001 gid=1001 # mail centos 0 umask 2 XDG_SESSION_ID=14; export XDG_SESSION_ID HOSTNAME=kernel; export HOSTNAME SHELL=/bin/bash; export SHELL HISTSIZE=1000; export HISTSIZE ... cat ~/.bashrc marcinDELIMITER2ccbf31a
|
既然是计划任务,那么应该会有任务执行的方式,并且将这些任务排进行程表中。那么产生计划任务的方式是怎么进行的?
事实上,我们使用 at 这个命令来产生所要运行的计划任务,并将这个计划任务以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行了。就这么简单。
不过,并不是所有的人都可以进行 at 计划任务。为什么?
因为系统安全的原因。很多主机被所谓的攻击破解后,最常发现的就是他们的系统当中多了很多的黑客程序, 这些程序非常可能运用一些计划任务来运行或搜集你的系统运行信息,并定时的发送给黑客。
所以,除非是你认可的帐号,否则先不要让他们使用 at 命令。那怎么达到使用 at 的可控呢?
我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制。加上这两个文件后, at 的工作情况是这样的:
先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中); 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 命令了。
如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。
透过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为帐号没有在该文件中,就能够运行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思 (您可以自行检查一下该文件)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行。
at允许使用一套相当复杂的指定时间的方法。他能够接受在当天的hh:mm(小时:分钟)式的时间指定。
假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。
用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。
指定的日期必须跟在指定时间的后面。上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。
指定格式为:now + count time-units ,now就是当前时间,timeunits是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。
更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
batch
由系统自行选择在资源较为空闲时运行指定的任务;
crontab
at – 周期性任务计划,且需要开启crond进程
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
- 系统cron任务;没有默认运行用户身份,所以需要额外指定运行者; /etc/crontab vim命令
1
2
3
4
5
6
7
8
9
10
# 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
-
7个字段: 前5个字段:时间点 user-name: 以哪个用户的身份运行任务 command to be executed: 要运行任务
- 用户cron任务:由某个用户所提交,默认就以提交者的身份运行,所以无需额外指定运行者; /var/spool/cron/USERNAME vim命令;不建议 ,crontab命令:建议
1
2
3
4
5
6
7
8
9
10
# 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
# | | | | |
# * * * * * command to be executed
5个时间点:分钟(0-59),小时(0-23),日(1-31)月(1-12),周(0-7)
- 注意:几月几号与4周几,不建议同时使用;*
时间表示法:
- *: 对应时间点有效取值范围内的每个时间点;
- -: 一个特定连续时间范围, 3-7
- ,:一个离散的时间点, 3,5,7
- /#:有效时间范围内的每多少时间;用于指定频率;1-30/4, */4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
## SYNOPSIS at [OPTION]... TIME crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] crontab -n [ hostname ] crontab -c
## 常用参数 -u user: 不是管理自己的cron任务,而是指定的目标用户的cron任务;仅root拥有管理其它用户的cron任务的权限;默认管理自己的; -l: list,列出任务; -r: remove, 移除所有任务; -e: edit,编辑,打开一当前shell会话的默认编辑器来编辑cron任务表; -i: 在删除用户的crontab文件时给确认提示。
## 操作实践 $ crontab -e
#1 用gentoo创建一个新的crontab文件 $ crontab -e --> no crontab for gentoo - using an empty one crontab: installing new crontab
$ crontab -l --> * * * * * <pre class="inline:true decode:1 " >which ls --skip-alias
|
.
#2 在crontab中使用date命令
$ crontab -e
* * * * * which --skip-alias ls -al . > /tmp/gentoo.$(date ‘+/%F %T’).log
注意事项
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配 置环境变量引起的。 在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的, 程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。 不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。 所以注意如下3点:
- 脚本中涉及文件路径时写全局路径;
- 脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
1
2
3
4
5
6
7
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
- 当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
1
2
3
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:
1 2 3 |
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
|
/dev/null 2>&1表示先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了 /dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
系统级任务调度与用户级任务调度
系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过 crontab –uroot –e来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到 /etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。
其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。 当crontab突然失效时,可以尝试 /etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错 tail -f /var/log/cron。 千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。 在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成 date "+/%Y/%m/%d"。
每周一到周六的凌晨3点20分,运行cp命令对/etc/目录进行归档另存,存储位置为 /backups/etc-YYYY-MM-DD;
1 2 3 |
20 3 * * 1-6 <pre class="inline:true decode:1 " >which cp
|
-a /etc/ /backups/etc-$(date ‘+/%F’)
每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为 /backups/fstab-YYYY-MM-DD-hh-mm-ss;
1 2 3 |
30 2 * * 0 <pre class="inline:true decode:1 " >which cp
|
-a /etc/fstab /backups/fstab-$(date ‘+/%F-/%H-/%M-/%S’)
每天晚上12点,取得/proc/meminfo文件中所有以S或M开头的行,追加至 /statistics/meminfo.txt文件中,且每天的消息之前,要加上类似===============分隔线;
1 2 3 4 |
0 0 * * * echo -e '/033[31m===========================/033[0m' >> /statistics/meminfo.txt; / cat /proc/meminfo | egrep '^(S|M)' >> /statistics/meminfo.txt
|