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

相关推荐
生信大表哥13 分钟前
bulk RNA-Seq (4)合并表达矩阵
linux·生信·数信院生信服务器
代码AC不AC1 小时前
【C++】异常
c++·学习·异常
Cristiano777.1 小时前
周学习记录
学习
9ilk1 小时前
【基于one-loop-per-thread的高并发服务器】--- 项目测试
运维·服务器·c++·后端·中间件
DeeplyMind1 小时前
虚拟化hypervisor:Xen简介
linux·virtualization·xen
property-1 小时前
服务器开荒:安装宝塔面板
运维·服务器
教练、我想打篮球2 小时前
05 2个路由器配置dhcp服务器+dhcp中继器配置两个子网的dhcp服务
运维·服务器
adnyting2 小时前
【Linux日新月异(二)】CentOS 7用户与用户组管理深度指南:保障系统安全的基石
linux·运维·centos
渡我白衣2 小时前
深入理解 OverlayFS:用分层的方式重新组织 Linux 文件系统
android·java·linux·运维·服务器·开发语言·人工智能
waves浪游2 小时前
进程概念(上)
linux·运维·服务器·开发语言·c++