systemd-run 可启动受 systemd 管理的临时后台任务,支持资源限制与生命周期控制;默认以 scope 模式运行,自动脱离终端,通过 --property 设置 cpuquota、memorymax 等参数实现精细管控,并需确保 cgroup v2 启用。

在 Linux 中,systemd-run 可以启动一个临时的、受 systemd 管理的服务单元,实现后台运行、资源隔离与限制。它天然支持“后台分离”(即不阻塞终端、不依赖当前 shell 生命周期),并可通过参数精细控制 CPU、内存、IO、进程数等资源。关键在于正确使用 --scope 或 --service 模式,并搭配资源控制选项。
用 systemd-run 启动独立后台任务
默认情况下,systemd-run 启动的是 transient scope 单元,自动脱离当前终端,即使关闭 shell 也不会终止任务:
-
systemd-run --scope --collect your-script.sh:以 scope 方式运行,退出后自动清理(除非加--remain-after-exit) -
systemd-run --scope --no-block --collect your-script.sh:立即返回 shell,不等待脚本结束 - 脚本会运行在独立的 cgroup 下,具备完整的 systemd 生命周期管理能力(可查状态、停止、重启)
施加资源限制(CPU / 内存 / 进程数)
所有资源限制通过 --property=KEY=VALUE 指定,适用于 scope 和 service 模式:
- CPU 限制:
--property=CPUQuota=50%(平均占用不超过 50% 的单核算力) - 内存上限:
--property=MemoryMax=512M(cgroup v2 默认启用,超限时 OOM kill) - 最大进程数:
--property=TasksMax=32(防止 fork 炸弹或失控子进程) - IO 限速(需启用 io.weight/io.max):
--property=IOWeight=10(相对权重,配合其他 IO 负载使用)
注意:确保系统使用 cgroup v2(cat /proc/sys/kernel/cgroup_version 应为 2),且内核启用对应控制器(如 systemd.unified_cgroup_hierarchy=1 在启动参数中)。
查看、监控与调试运行中的任务
每个 systemd-run 任务都会生成唯一单元名(如 run-r9b3a2c4d5e6f.scope),可用标准 systemd 命令管理:
-
systemctl list-units --type=scope --state=running:列出所有活跃的临时 scope -
systemctl status run-*.scope:查看具体任务状态、资源使用、最后输出 -
systemctl show run-*.scope -p CPUUsageNS,MemoryCurrent,TasksCurrent:提取实时资源数值(需 cgroup v2) -
journalctl -u run-*.scope -n 50:查看标准输出/错误日志(自动捕获)
进阶:带环境、工作目录与超时的健壮调用
生产环境建议显式指定上下文,避免隐式依赖:
-
--working-directory=/path/to/work:设定脚本执行路径 -
--environment="PATH=/usr/bin:/bin" "HOME=/tmp":覆盖环境变量 -
--on-failure=notify-email@.service:失败时触发自定义通知服务 -
--runtime-max-sec=3600:强制一小时后终止(防长期挂起) -
--property=Restart=on-failure --property=RestartSec=10:配合--scope实现有限重试(慎用于非幂等脚本)
不复杂但容易忽略:所有资源属性必须拼写准确(如 MemoryMax 不是 MemoryLimit),且大小写敏感;建议先用 systemd-run --scope --dry-run 验证参数是否被识别。











