Orange的运维学习日记--23.Linux计划任务详解

Orange的运维学习日记--23.Linux计划任务详解

文章目录

一次性计划任务

一次性计划任务用于在未来某个时间点执行单个命令或脚本

atd 服务

Linux 系统通过 atd 后台进程提供一次性计划任务功能

安装 at 软件包

bash 复制代码
yum install at

启用 atd 服务并设置开机启动

bash 复制代码
systemctl enable --now atd
systemctl status atd

at 命令

at 命令从标准输入读取要执行的命令

基本语法
bash 复制代码
at <timespec>
交互式示例

在提示符下输入命令内容,完成后按 Ctrl+D

bash 复制代码
at now +5 minutes
echo hello world > /tmp/hello.log
<Ctrl+D>
job 1 at Wed Dec 21 17:09:00 2022
脚本文件示例
bash 复制代码
cat > myscript.sh << 'EOF'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
EOF

at now +5 minutes < myscript.sh
job 2 at Wed Dec 21 17:10:00 2022

at 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 -latq

bash 复制代码
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

bash 复制代码
at -q b now +5 minutes < myscript.sh
job 4 at Wed Dec 21 17:11:00 2022

at -l -q b
4    Wed Dec 21 17:11:00 2022 b root
查看任务详细内容

使用 at -c 作业号

bash 复制代码
at -c 3
...
${SHELL:-/bin/sh} << 'marcinDELIMITER4bf95eea'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log

marcinDELIMITER4bf95eea
删除任务

使用 atrm 作业号at -d 作业号

bash 复制代码
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 会将输出通过邮件发送给作业所有者

查看任务

bash 复制代码
crontab -l

编辑任务

bash 复制代码
crontab -e

编辑文件支持

  • 环境变量声明(name=value),常见变量有 SHELL、MAILTO、PATH
  • 空行和 # 注释
  • 每行定义一个任务,按六列顺序排列
    1 分钟
    2 小时
    3 日
    4 月
    5 星期几
    6 要执行的命令

字段格式

  • * 表示任意
  • x-y 表示范围
  • x,y 表示列表,可混合范围
  • */n 表示步长间隔
  • 月份和星期支持三字母缩写(Jan、Feb...Mon、Tue...)

示例

bash 复制代码
# 每年 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

示例操作

bash 复制代码
export EDITOR=vim
crontab -e
*/2 2,3-23 * * * date >> /tmp/date.log

tail -f /tmp/date.log
2022年12月21日星期三21:02:01CST
2022年12月21日星期三21:04:01CST

删除任务

bash 复制代码
crontab -r

管理其他用户任务

root 用户可使用 -u 参数

bash 复制代码
crontab -u laoma -l
crontab -u laoma -r

从文件导入任务

bash 复制代码
crontab mycron

系统周期性计划任务

系统管理员可在多处定义周期性作业,crond 会统一读取

读取顺序

  • /etc/crontab
  • /etc/cron.d/ 目录内所有文件
  • /etc/anacrontab

/etc/crontab

该文件格式与用户 crontab 类似,多一个用户字段指定执行账户

bash 复制代码
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

bash 复制代码
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 处理

bash 复制代码
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 在系统启动后根据状态记录执行错过的任务

相关推荐
Linux技术芯37 分钟前
#Linux内存管理# 详细介绍madvise函数的工作原理
linux
Chef_Chen40 分钟前
从0开始学习R语言--Day54--双重固定模型
学习
Hey! Hey!40 分钟前
在 Ubuntu 22.04 上运行 cAdvisor 时遇到 mountpoint for cpu not found 错误
linux·运维·ubuntu
渡我白衣2 小时前
Linux网络编程:基于UDP 的聊天室雏形
linux·网络·udp
宇寒风暖2 小时前
Flask 框架全面详解
笔记·后端·python·学习·flask·知识
gnawkhhkwang2 小时前
io_getevents 和 io_pgetevents 系统调用及示例
linux·c语言·开发语言
小白不想白a2 小时前
【MySQL】MySQL的安全风险与安装安全风险
linux·数据库·mysql·安全
渡我白衣3 小时前
Linux网络编程:UDP 的echo server
linux·网络·udp
Hello小赵3 小时前
嵌入式硬件学习(十)—— LED驱动+杂项设备驱动
嵌入式硬件·学习