这篇笔记主要记录一些常见的Linux定时任务
一、定期任务
crontab
最小粒度,1分钟
守护进程 crond
每分钟扫描一次下列文件
/var/spool/cron/* 命令生成
/etc/crontab 文本文件
/etc/cron.d/* 自定义的定时任务
任务格式:分 时 日 月 周
编辑方式
1、crontab 命令
2、/etc/crontab 文件
3、/etc/cron.d/* 文件
限制文件
/etc/cron.allow 在文件中的可以使用crontab
/etc/cron.deny 不在文件中的用户可以使用crontab (默认存在空文件)
/etc/security/access.conf
运行方式
1、crontab创建工作
2、系统会将工作以文本格式写入 /var/spool/cron/
3、创建用户名的定时文件
4、等待crond执行,观察日志输出
输出日志
/var/log/cron
配置方式
1、命令配置 常用
设置:crontab [-u username] [-l|-e|-r]
-u 指定用户,不添加就是当前用户
-l 列出crontab列表,默认当前用户
-e 编辑crontab
-r 移除所有的定时任务,建议编辑处理
内容格式:
0 12 * * * mail -s "at 12:00" test_user < /home/test_user/.bashrc
分 时 日 月 周 |<==============指令串========================>|
特殊字符:
* 任意时刻
* 任意时刻
, 多个值
0 3,6 * * * command 每天3点整和6点整都执行
- 一段时间
20 8-12 * * * command 每天8:20-12:20 ,执行4次
/ 每隔多久
*/5 * * * * command 每隔5分钟执行一次
案例:
crontab -e
进入vi界面,输入i,写入如下内容,按esc,输入q退出
0 12 * * * mail -s "at 12:00" test_user < /home/test_user/.bashrc
2、编辑/etc/crontab 较少用
注意:编辑/etc/crontab可能是写入到内存的,需要重启crond服务才会生效
编辑内容:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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
0 12 * * * root echo `date` > /tmp/abc
重启crond服务
3、编辑其他目录 一般不用
注意:放在下列目录下的文件必须是可执行文件!
bash
/etc/cron.d/
/etc/cron.daily/
/etc/cron.hourly/
/etc/cron.monthly/
/etc/cron.weekly/
注意事项
1、日月和周不能同时存在
2、编辑/etc/crontab可以指定谁接受结果邮件
3、crond日志在/var/log/cron
4、用户密码过期,定时任务将会执行失败
5、定时任务如果有大量输出,需要将结果重定向,可能会出现sendmail的僵尸进程
anacron
用于检测系统未进行的crond任务,没仔细研究过
实现原理
crontd每小时执行一次 anacron 程序,anacron 会读取时间戳,对比上次记录的 anacron 执行时间,如果时间有差异,代表存在未执行的任务,然后会执行未执行的任务
配置文件
放置在/etc/cron.hourly/0anacron
执行流程
- 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天
- 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳
- 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令
- 若准备进行指令,根据 /etc/anacrontab 的设定,将延迟 5 分钟 + 3 小时,看 START_HOURS_RANGE 的设定
- 延迟时间过后,开始执行后续指令,即 run-parts /etc/cron.daily 这串指令
- 执行完毕后, anacron 程序结束
这个是个开机自启的程序,会影响开机速度,如果长时间关机,在开机机后一个小时CPU会忙碌,因为anacron会执行未执行的定时任务
二、定时任务
at
可以在指定时间执行,不过平时用的少,一般crond就能满足绝大多数的需求了
守护进程 atd
运行方式
- at 指令产生要运行的工作
- 将工作以文本格式写入/var/spool/at/ 目录内
- 等待atd服务执行
限制文件
- /etc/at.allow 只有在文件中的用户可以使用at
- /etc/at.deny 不在文件中的用户可以使用at (默认存在空文件)
- 都没有,就只有root能执行at
- 上述情况一般不会同时存在
使用方式
1、设置
bash
at [-mldv] Time
-m 结束后以邮件方式通知
-l 等价于atq,列出当前系统上该用户的at列表
-d 等价于atrm,取消一个at列表中的工作
-v 列出at列表,显示较详细
-c 列出某个工作的实例指定内容
时间格式:
HH:MM 04:00 今天的4点执行,如果已经过了,就明天4点执行
HH:MM YYYY-MM-DD 04:00 2015-07-30 指定某一时刻执行
HH:MM[am|pm] [Month] [Date] 04pm July 30 指定某一时刻执行
H:MM[am|pm] + number [minutes|hours|days|weeks]
now + 5 minutes 五分钟后执行
04pm + 3 days 三天后的下午四点执行
注意:单位后面要带s,命令最好使用绝对路径 *
2、查看
bash
at -c 工作号码
at -l 任务清单
3、工作目录
at 会将下达命令的目录作为工作目录,所以命令和文件都要写绝对路径,以防万一
4、输出结果
at 的执行与终端机环境无关,所有输出结果发送到mailbox
如果执行的命令没有输出,就不会发送邮件,可以使用-m强制发送邮件
5、案例
bash
编辑:
at now + 5 minutes
at> /bin/mail -s "testing at job" root < /root/.bashrc
at> /bin/sync
at> <EOT> 按Ctrl+d 结束输入
job 1 at Fri Oct 27 00:26:00 2023
查看:
at -c 2 查看工作内容
atq 查看工作列表
取消:
at -d 2
或者
atrm 2
6、其他
bash
man at
NAME
at, batch, atq, atrm - 排队、检查或删除以后要执行的作业。
总览
at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...] atq [-V] [-q 队列] [-v]
atrm [-V] 作业 [作业...]
batch [-V] [-q 队列] [-f 文件] [-mv] [时间]
描述
at 和 batch 从标准输入或一个指定的文件读取命令,这些命令在以后某个时间用 /bin/sh 执行。
at 在指定的时间执行命令。
atq 列出用户的等待执行的作业;在用户是超级用户的情况下,列出所有人的作业。
atrm 删除作业。
batch 在系统负载水平允许的时候执行命令;换句话说,当平均负载降到低于0.8,或降到了在 atrun 文件中指定的期望值时运行。 译注:atrun
文件参见 atd 手册页。
三、空闲时任务
batch
用来在系统空闲时执行的任务,平时基本没在用,没怎么了解太深
工作时间
在CPU负载低于0.8时,进行下达的命令
使用方式
bash
batch
at>/usr/bin/updatedb
at><EOT> # ctrl+d
job 2 at Fri Oct 27 00:30:00 2023
管理软件
通过使用可以看出与at的管理方式相同,atq,atrm管理