systemd-run 是什么
systemd-run 让 systemd 直接托管一条命令或脚本,不必事先编写 unit 文件。它有两条用法:加 --unit 立即以服务方式运行一次性任务,日志进 journal;加 --on-active(相对时间)或 --on-calendar(日历时间)则生成瞬时 timer,到点再执行。适合临时排障、限时压测、夜间批作业这类用完即走的动作,长期计划任务仍应落正式 unit。
基本信息
| 适用平台 | systemd 管理的 Linux:RHEL/CentOS 7+、openEuler、银河麒麟、统信 UOS |
|---|---|
| 权限要求 | 默认 root 运行;普通用户加 --user 走用户实例 |
| 瞬时单元 | 存放于 /run/systemd/transient/,重启后消失 |
| 输出查看 | 日志进 journal,用 journalctl -u 单元名 查看 |
典型使用场景
- 临时排障:把诊断命令交给 systemd 跑,SSH 断开也不会被中断
- 延迟动作:30 分钟后重启服务或清缓存,不值得为它写 crontab
- 夜间批处理:用 --on-calendar 指定每天凌晨跑一次,结束后不留文件
- 资源限制:用 --property 限定内存与 CPU 上限再跑一次性任务,控制对在跑业务的影响
- 权限验证:以 --uid 指定普通用户运行,提前验证应用的非特权启动方式
常用示例
常用示例
systemd-run --unit=test-ping ping -c 3 10.0.0.1 # 立即运行并交给 systemd 托管
systemd-run --on-active=30m /opt/scripts/check.sh # 30 分钟后执行一次
systemd-run --on-calendar='*-*-* 03:00:00' /opt/job.sh # 每天 03:00 执行
journalctl -u test-ping -n 20 --no-pager # 查看这次运行的输出
systemctl list-timers 'run-*' --all # 列出瞬时 timer
systemd-run --property=MemoryMax=512M --unit=big ./tool # 限内存运行
systemd-run --user --on-active=10m /home/u/notify.sh # 用户级延时任务,无需 root常用选项速查
| 选项 | 作用 | 注意事项 |
|---|---|---|
| --unit=名字 | 指定瞬时单元名 | 同名单元已存在会直接报错 |
| --on-active=30m | 相对延时执行 | 单位 s/m/h/d,从提交时刻算起 |
| --on-calendar=... | 按日历时间执行 | 格式同 OnCalendar,先用 systemd-analyze calendar 校验 |
| --property= | 附加单元属性 | 如 MemoryMax、CPUQuota、User、Restart |
| --collect | 结束后自动清理单元 | 避免失败的单元残留在 systemctl 列表 |
| --pipe | 标准输出接回当前终端 | 不加则输出只进 journal |
瞬时单元放在 /run 下,重启即消失:不要用它承载需要跨重启保留的计划任务,那种场景写正式 .timer 文件。
systemd-run 默认以干净环境变量执行,脚本里别依赖当前 shell 的 PATH 与自定义变量;需要时用 --setenv=KEY=VALUE 显式传入。