一次性执行进程atd
at
一次性执行进程atd
/var/spool/at下
系统服务:必须启动方可生效
etc/init.d.atd
格式:
at [HH:MM] [yyyy-mm-dd]
按Ctrl+d键提交计划
例子:设置定时/延后执行的任务
#at 21:30 at>shutdown -r now //定于21:30重启系统 at<EOT>
atq
查询at任务
atrm
删除at任务
atrm 2 //删除指定的计划
周期性任务服务名crond
Crond是linux系统中用来定期执行命令或指定程序任务的服务。一般情况下,安装完操作系统之后,默认便会启动此任务调度服务。Crond服务会定期检查系统中是否有要执行的任务工作,如果有,便会根据预先默认的规则自动执行该任务工作。
Linux任务调度的工作可以分为以下两类:
1.系统自身执行的工作
系统周期行执行的任务工作,如轮询系统日志、备份系统数据数据、清理缓存等。
2.用户执行的工作
某个用户定期要做的任务工作:例如每隔10分钟和互联网上时间服务器进行时间同步,每天晚上0点备份站点数据,一般此类工作需要由每个用户自行设置。
通过crontab,我们可以在固定的时间间隔执行指定的系统指令或shell脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。
使用者权限文件:
用户计划:
默认情况下,用户所建立的crontab文件存于/var/spool/cron中,其crontab对应的文件名于用户名一致
/var/spool/cron/用户名
系统服务
/etc/init.d/crond
必须启动方可生效
软件包
vixie-cron
crontabs
语法:
crontab
-l: 列出当前用户的所有cron任务
-e: 编辑
-r: 移除所有任务
-u USERNAME: 管理其用户的cron任务
anacron:
最多监控每天的任务
或者:
1、编辑cron计划任务
-格式:crontab -e [-u 用户名]
2、查看cron计划任务
-格式:crontab -l [-u 用户名]
3、删除cron计划任务
-格式:crontab -r [-u 用户名]
默认的计划任务
全局配置:/etc/crontab
系统计划
/etc/cron.hourly/* /etc/cron.dialy/* /etc/cron.weekly/* /etc/cron.monthly/*
格式分为七段,前五段为时间设定段,第六段以那个用户执行crontab(默认是当前用户),第七段为所要执行的命令段。
系统cron任务:
/etc/crontab
分钟 小时 天 月 周 用户 任务
用户cron任务:
/var/spool/cron/USERNAME
分钟 小时 天 月 周 任务
格式:
分 时 日 月 周 命令
* 表示该范围内的任意时间
, 表示间隔的多个不连续时间点
- 表示一个连续的时间范围
/n 指定间隔的时间频率,指定时间频率,每n.
crontab记录格式
执行周期、可执行语句
执行周期 设置说明
分钟: 从0到59之间的整数
小时: 从0到23之间的整数
日期: 从1到31之间的整数
月份: 从1到12之间的整数
星期: 从0到7之间的整数,0或7代表星期日
时间的有效取值:
分钟:0-59
小时:0-23
天:1-31
月:1-12
周:0-7,0和7都表示周日
执行周期示例
0 17 * * 1-5 周一到周五每天17:00
30 8 * * 1,3,5 每周一/三/五 的8点30分
0 8-18/2 * * * 8点到18点之间的每2小时
0 * */3 * * 每3天
crontab依赖的服务
[root@localhost ~]# chkconfig --list |grep crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@localhost ~]# /etc/init.d/crond status crond (pid 2062) is running... [root@localhost ~]# /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ]
cron的环境变量
cron执行所有命令都去PATH环境变量指定的路径下去找
PATH /bin:/sbin:/usr/bin:/usr/sbin
crontab命令生产环境专业写法
例1:每分钟打印一次自己的名字到/server/log/自己的名字命名的文件中。
#print char task by zgy for rogrammer A at 2010-12-12 */1 * * * * echo "test" >>/server/log/zgy.log 2>&1
写定时任务的注意事项:
1.写定时任务要写请注释是个好习惯 2.执行任务时可以省略用户,在执行脚本时,尽量带上/bin/bash,否则有可能因为脚本没有执行权限而无法执行 3.需要root权限执行的任务可以登录到root用户下,如果不需要root权限,可以登陆到普通用户下设置。
这里要特别注意不同用户的环境变量问题,如果是调用了环境变量(如生产场景java脚本),此时,最好在脚本中将环境变量重新export下。 4.定时任务命令的结尾最好>/dev/null 2&>1等内容,如果需要打出日志,可以追加到指定的日志里,不推荐留空这种不专业的做法
5.在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及屏幕输出的内容的内容去掉,如果还需要,可定向到日志里。
说明:
其中,/dev/null为特殊的设备,表示黑洞设备或空设备。2>&1 使标准错误和标准输出一样,本命令内容即把脚本的输出重定向到/dev/null,即不记录任何输出,也不给系统发邮件。 如果定时任务不加>/dev/null 2>&1等命令配置,时间长了,可能由于系统未开启邮件服务而导致邮件临时目录/var/spool/clientmqueue文件数猛增,
占用大量磁盘inode节点。提示:上面的写法也可写成1>/dev/null 2>&1。
crontab 生产解决案例
案例1:No space left on device故障1
在设置crontab时提示No Space left on device,用df -k检查还有空间,用df -i显示/var/已占用100%,如果inode耗尽,则系统上将不能创建文件。
在/var/spool/clientmqueue/下有超多的文件ls半天没反应,用rm -rf *会自动跳出root,然后xargs来配合解决。
cd /var/spool/clientmqueue && ls | xargs rm -f 最后清理了该目录中的内容。当然,如果文件数超多,执行ls | xargs rm -f 也会长时间无反应,此时,
也可以直接
cd /var/spool && rm -fr clientmqueue,
然后
mkdir clientmqueue && chmod 770 clientmqueue && chown smmsp smmsp -R /var/spool/clientmqueue。
系统中/var/spool/clientmqueue目录权限为:
[root@localhost ~]# ls -ld /var/spool/clientmqueue/ drwxrwx--- 2 smmsp smmsp 4096 May 5 19:44 /var/spool/clientmqueue/
原因分析
系统中cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件。 解决方法:开启邮件服务,并把crontab里面的命令后面加上>/dev/null 2>&1,在做定时执行脚本时,把屏幕输出定向到日志中。
计划任务授权
at任务控制
/etc/at.allow、/etc/at.deny
crond任务控制
/etc/cron.allow、/etc/cron.deny
注意:
如果allow文件存在,则仅允许指定的用户
否则检查deny文件,除指定用户外其余都允许
如果两个文件都不存在,则只允许root使用
管理员可以删除其他用户的计划任务
1.当/etc/cron.allow和/etc/cron.deny都不存在时,仅root用户能创建计划任务 2.仅/etc/cron.deny存在时,只有在该文件时的用户才被拒绝 3.仅/etc/cron.allow存在时,只有在该文件时的用户才被允许 4.当/etc/cron.allow和/etc/cron.deny都存在时,则/etc/cron.deny文件被忽略
cron计划中断与补救
anacron
cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务在恢复正常执行一次;
anacron也要随时在线执行(在经常关机的系统上开启)