systemd-run 可启动受资源限制的临时任务:用 --scope 模式实现终端输出与脱离 shell,--service 模式完全后台;通过 --property 设置 CPUQuota、MemoryMax 等参数限制资源,需 cgroup v2 支持;支持 systemctl 管理状态与生命周期。

用 systemd-run 启动临时任务,既能自动脱离终端、避免被 shell 退出中断,又能通过 cgroup v2 精确限制 CPU、内存等资源,并由 systemd 统一管理启停与状态——关键在于选对模式(--scope 或 --service)、配好 --property 参数,并确认系统启用 cgroup v2。
选择合适运行模式:Scope vs Service
两种模式决定进程归属与交互行为:
-
Scope 模式(推荐临时脚本):
systemd-run --scope把当前 shell 启动的进程(含子进程树)注册为一个 scope 单元。它同步执行、输出直连终端,但已脱离 shell 生命周期——关掉终端不影响运行;适合需要即时看到输出又要求后台稳定的场景。 -
Service 模式(默认):
systemd-run不加--scope时,以独立 service 单元异步启动命令。不输出到当前终端,完全后台化,适合无交互的长期任务(如备份、轮询)。 - 无论哪种,都可通过
--unit=xxx指定易读名称,避免系统自动生成的run-r1a2b3c4.scope类乱码名。
设置核心资源配额(需 cgroup v2)
所有限制统一用 --property=KEY=VALUE 传入,生效前提是系统运行在 cgroup v2 下(检查:cat /proc/sys/kernel/cgroup_version 输出应为 2):
-
CPU 使用上限:用
--property=CPUQuota=30%限制平均占用不超过单核 30%;若想保底+限高,可叠加--property=CPUWeight=50(相对权重,配合其他服务调度)。 -
内存硬限制:用
--property=MemoryMax=1G设定最大可用内存,超限时触发 OOM killer 杀掉该 scope/service 内任一进程。 -
进程数封顶:用
--property=TasksMax=16防止 fork 炸弹或失控子进程耗尽 PID 资源。 -
IO 控制(进阶):需内核支持 io controller,例如
--property=IOWeight=20降低磁盘 IO 优先级,避免挤占系统响应。
管理任务生命周期与状态
每个 systemd-run 任务都是真实 systemd 单元,可全程跟踪:
- 查看运行中任务:
systemctl list-units --type=scope --state=running(scope)或--type=service(service) - 查具体状态与最后输出:
systemctl status your-unit-name,其中包含启动时间、资源使用摘要、最近 stdout/stderr(最多保留 4KB) - 手动停止:
systemctl stop your-unit-name;若加了--remain-after-exit=yes,单元会保持“inactive (dead)”状态,仍可查日志或重启 - 清理残留单元:
systemctl reset-failed your-unit-name(清除失败标记),或直接systemctl daemon-reload刷新单元缓存
实用组合示例
一条命令完成“后台压缩目录,限 40% CPU、800MB 内存、最多 8 个进程,且关终端不中断”:
systemd-run --scope --unit=backup-job --property=CPUQuota=40% --property=MemoryMax=800M --property=TasksMax=8 --collect --no-block tar -czf /backup/data-$(date +%s).tar.gz /data
说明:--collect 表示任务结束后自动清理单元;--no-block 让命令立即返回 shell;--scope 保证进程树被完整捕获并隔离。


















