systemd-run 临时定时任务
不想落 unit 文件时,可以用 systemd-run 直接创建瞬态 timer 与 service:--on-calendar 按日历触发,--on-active 在延迟之后触发,任务完成后瞬态单元自动清理。临时巡检、一次性实验、验证日历表达式都很方便;正式且长期的任务仍应写成 unit 文件并纳入版本管理。
基本信息
| 用途 | 在命令行创建瞬态定时任务 |
|---|---|
| 语法 | systemd-run --on-calendar=… [--unit=名] 命令 |
| 相关选项 | --on-active 延迟触发、--on-boot 启动后触发、--collect 执行后清理 |
| 生命周期 | 瞬态单元默认不持久化,重启后不再存在 |
典型使用场景
- 临时巡检:在未来某时刻跑一次磁盘检查
- 验证日历表达式是否符合预期
- 延迟执行一次性的重载或重启动作
- 演示环境里快速造一个定时任务
- 等业务低峰时段自动执行维护脚本
- 避免为一次性需求长期保留 unit 文件
常用示例
常用示例
sudo systemd-run --on-calendar='*-*-* 03:00:00' --unit=tmp-diskcheck /opt/scripts/diskcheck.sh
sudo systemd-run --on-active=30s --unit=tmp-reload systemctl reload nginx
systemctl list-timers 'tmp-*' --no-pager # 查看瞬态定时器
systemctl status tmp-diskcheck.timer --no-pager # 查看状态
journalctl -u tmp-diskcheck.service -n 20 # 查看执行日志
sudo systemctl stop tmp-diskcheck.timer # 停止并清理
systemctl daemon-reload # 手工调整后重新加载触发选项
| 选项 | 触发方式 | 典型用途 |
|---|---|---|
| --on-calendar | 按日历表达式触发 | 每天固定时刻执行 |
| --on-active | 延迟一段时间后触发 | 稍后执行一次 |
| --on-boot | 系统启动后触发 | 开机若干秒后做动作 |
| --unit | 自定义单元名称 | 便于后续管理与清理 |
| --collect | 执行后自动清理 | 一次性任务不留状态 |
--on-calendar 使用 systemd 的日历表达式语法,写法与 unit 里的 OnCalendar 一致;交给自动化之前,先手工跑一次确认表达式能被正确解析。
瞬态单元不持久化:机器重启后不会自动恢复,重启后仍需执行的任务必须写成真正的 unit 文件,放进配置管理。
--unit 名称冲突会导致创建失败,脚本里生成单元名时加上时间戳后缀,可以避免重复提交时相互覆盖。
瞬态 timer 的执行结果同样进入 journal:用 journalctl -u 单元名 查看,排查未触发问题时先确认单元是否仍处于 active 状态。
验证日历表达式可以先创建瞬态 timer 再用 list-timers 看下次触发时间,比上线之后慢慢等结果高效得多。