任务计划分类:
一次性任务计划:只执行一次就结束 at batch
周期性任务计划:每隔一定的周期去做相同的事情 cron
作业的执行结果以邮件通知给相关用户
mail- send and receive internet mail 使用mail命令查看用户邮件
(1)at命令:
at [option] TIME
option:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务 -m:当任务被完成之后,将给用户发送邮件,即使没有标准输出
TIME:定义出什么时候进行 at 这项任务的时间
HH:MM [YYYY-mm-dd]
HH:MM 02:00 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM[am|pm] + number [minutes|hours|days|weeks]
执行方式:
1、交互式2、输入重定向3、at -f文件
at 交互模式下是不是输错一次就要推倒重来
不需要,ctrl+backspace 可以退格
附加知识点:
1、at队列存放在/var/spool/at目录中
2、黑白名单
白名单/etc/at.allow默认不存在
黑名单/etc/at.deny默认存在
只要/etc/at.allow存在,则只有该文件中的用户和root可以执行at命令(此时deny文件可以视为无效)
如果/etc/at.allow不存在,
1)/etc/at.deny存在,只有deny文件中的用户被拒绝执行at命令
2)/etc/at.deny不存在,只有root用户可以执行at命令
(2)batch命令:
让系统自行选择空闲时间去执行此处指定的任务
(3)cron
相关程序包:cronie,cronie-anacron,crontabs
确保crond守护进程处于运行状态:
centos 7:systemctl status crond
centos 6:service crond status
3.1系统cron任务
编辑/etc/crontab文件命令格式
# 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
例如:晚上9点10分运行echo命令:
10 21 * * * gentoo /bin/echo “Howdy!”
时间表示法:
1、特定值
给定时间点有效取值范围内的值
2、*
给定之间点上有效取值范围内的所有值
3、离散取值:,
#,#,#
4、连续取值:-
#-#
5、在指定时间范围上,定义步长:
/#:#即为步长
示例:每3小时echo命令:
* */3 * * * gentoo /bin/echo “howdy!”错误
较小的时间范围需要指定特定的时间,否则相当于小时间范围内全部取值均执行
1 */3 * * * gentoo /bin/echo “howdy!”
@reboot Run once after reboot.
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
注:上面其中表达方式可以用来代替五颗星的位置
3.2用户cron任务:
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab [-u user] [-l|-r|-e] [-i]
-l:列出所有任务
-e:编辑任务
-r:移除所有任务
-i:同-r一同使用,交互式模式让用户有选择地移除指定任务
注:在所有任务中去删除特定任务,也可以crontab -e打开编辑器,删除特定行即可
-u user:root用户专用,代为为指定用户管理cron任务
at和crontab
一次性作业使用at
重复性作业使用crontab
没有被重定向的输出会被邮寄给用户
根用户能够修改其他用户的作业
注意:
1)运行结果标准输出和错误以邮件通知给相关用户;
2)对于cron任务来讲,%有特殊用途,在命令中要使用%,则需要转义;单引号隔绝引用,使用单引号不用转义
练习:
1、每天的2点和12点整,将/etc备份至/testdir/backup目 录中,保存的文件名称格式为“etcbak-yyyy-mm-ddHH.tar.xz”
mkdir /testdir/backup crontab -e 0 2,12 * * * /bin/tar -Jcf /testdir/backup/etcbak-`date +'%F'`.tar.xz /etc
2、每周2,4,7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
mkdir /logs crontab -e 0 0 * * 2,4,7 /var/log/messages /logs/messages-$(date +'%Y%m%d')
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
crontab -e 1 */2 * * * /bin/grep -E "^(S|M)" /proc/meminfo >>/meminfo.txt
4、工作日时间内,每小时执行一次“ip addr show”命令
crontab -e 1 * * * 1-5 /sbin/ip addr show
5、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报。
cd /bin vim chkdisk.sh block_used=df|grep -E "^/dev/sd"|tr -s " "|cut -d" " -f5|cut -d% -f1 inode_used=df -i|grep -E "^/dev/sd"|tr -s " "|cut -d" " -f5|cut -d% -f1 if [ block_used -gt 80 || inode_used -gt 80 ];then wall disk is full fi chmod +x chkdisk.sh crontab -e */10 * * * * chkdisk.sh
想了一下,这种方法是有缺陷的。当多个磁盘使用率同时超过80%时,无法进行正确的判断
注意:使用which或者whereis可以查询命令的绝对路径,用来帮助写cron任务计划。
原创文章,作者:maru,如若转载,请注明出处:http://www.178linux.com/75070