Orange的运维学习日记–23.Linux计划任务详解
文章目录
- Orange的运维学习日记--23.Linux计划任务详解
- 一次性计划任务
- atd 服务
- at 命令
- 基本语法
- 交互式示例
- 脚本文件示例
- timespec 格式示例
- 查看与管理任务
- 查看当前队列
- 查看任务详细内容
- 删除任务
- 用户权限控制
- 用户周期性计划任务
- 查看任务
- 编辑任务
- 删除任务
- 管理其他用户任务
- 从文件导入任务
- 系统周期性计划任务
- /etc/crontab
- /etc/cron.d
- /etc/anacrontab
一次性计划任务
一次性计划任务用于在未来某个时间点执行单个命令或脚本
atd 服务
Linux 系统通过 atd 后台进程提供一次性计划任务功能
安装 at 软件包
yum install at
启用 atd 服务并设置开机启动
systemctl enable --now atd
systemctl status atd
at 命令
at 命令从标准输入读取要执行的命令
基本语法
at <timespec>
交互式示例
在提示符下输入命令内容,完成后按 Ctrl+D
at now +5 minutes
echo hello world > /tmp/hello.log
<Ctrl+D>
job 1 at Wed Dec 21 17:09:00 2022
脚本文件示例
cat > myscript.sh << 'EOF'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
EOFat now +5 minutes < myscript.sh
job 2 at Wed Dec 21 17:10:00 2022at now +100 minutes -f myscript.sh
job 3 at Wed Dec 21 18:46:00 2022
timespec 格式示例
- now +5 hours
- teatime tomorrow
- noon +4 days
- 5 pm august 3 2016
详细定义见 /usr/share/doc/at/timespec
查看与管理任务
查看当前队列
使用 at -l
或 atq
at -l
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root
atd 提供 a–z 共 26 个队列,字母越靠后优先级越低
指定队列使用 -q
at -q b now +5 minutes < myscript.sh
job 4 at Wed Dec 21 17:11:00 2022at -l -q b
4 Wed Dec 21 17:11:00 2022 b root
查看任务详细内容
使用 at -c 作业号
at -c 3
...
${SHELL:-/bin/sh} << 'marcinDELIMITER4bf95eea'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.logmarcinDELIMITER4bf95eea
删除任务
使用 atrm 作业号
或 at -d 作业号
atrm 3
用户权限控制
/etc/at.allow
与 /etc/at.deny
管理用户访问 atd 服务
- 存在
/etc/at.allow
时,仅允许文件中列出的用户使用 at - 不存在
/etc/at.allow
时,禁止/etc/at.deny
中列出的用户使用 at
用户周期性计划任务
周期性任务通过 crond 后台进程执行,使用 crontab
命令管理
如果未重定向 stdout 和 stderr,crond 会将输出通过邮件发送给作业所有者
查看任务
crontab -l
编辑任务
crontab -e
编辑文件支持
- 环境变量声明(name=value),常见变量有 SHELL、MAILTO、PATH
- 空行和
#
注释 - 每行定义一个任务,按六列顺序排列
1 分钟
2 小时
3 日
4 月
5 星期几
6 要执行的命令
字段格式
*
表示任意x-y
表示范围x,y
表示列表,可混合范围*/n
表示步长间隔- 月份和星期支持三字母缩写(Jan、Feb…Mon、Tue…)
示例
# 每年 2 月 2 日 9:00 执行备份
0 9 2 2 * /usr/local/bin/yearly_backup# 七月每周五 9:00-16:00 每 5 分钟发送 Chime
*/5 9-16 * Jul Fri echo "Chime"# 工作日 23:58 运行日报脚本
58 23 * * 1-5 /usr/local/bin/daily_report# 工作日 9:00 发送 Checkingin 邮件
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss just checking in
示例操作
export EDITOR=vim
crontab -e
*/2 2,3-23 * * * date >> /tmp/date.logtail -f /tmp/date.log
2022年12月21日星期三21:02:01CST
2022年12月21日星期三21:04:01CST
删除任务
crontab -r
管理其他用户任务
root 用户可使用 -u
参数
crontab -u laoma -l
crontab -u laoma -r
从文件导入任务
crontab mycron
系统周期性计划任务
系统管理员可在多处定义周期性作业,crond 会统一读取
读取顺序
/etc/crontab
/etc/cron.d/
目录内所有文件/etc/anacrontab
/etc/crontab
该文件格式与用户 crontab 类似,多一个用户字段指定执行账户
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root# .---------------- 分钟 (0-59)
# | .------------- 小时 (0-23)
# | | .---------- 日 (1-31)
# | | | .------- 月 (1-12 或 Jan-Dec)
# | | | | .---- 星期几 (0-7 或 Sun-Sat)
# | | | | |
# * * * * * 用户 命令
01 4 * * * root /usr/local/bin/system_daily_job
/etc/cron.d
该目录用于存放自定义系统级 crontab 文件,避免 /etc/crontab
被更新覆盖
示例 /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
run-parts
会按文件名排序依次执行 /etc/cron.hourly
下的所有脚本
/etc/anacrontab
anacron 确保在系统关机后仍能执行重要任务,anacrontab 同样由 crond 处理
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45
START_HOURS_RANGE=3-22# period(天) delay(分钟) job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
字段说明
- period 定义周期天数,支持整数或宏(@daily、@weekly、@monthly)
- delay 定义首次执行前的延迟分钟数
- job-identifier 对应
/var/spool/anacron
中的状态文件名 - command 要执行的命令
anacron 在系统启动后根据状态记录执行错过的任务