systemd-run是创建临时systemd单元最直接方式,通过--scope和--property=KEY=VALUE动态设置CPU、内存等资源限制,无需编写.service文件。

在 Linux 中,systemd-run 是创建临时 systemd 单元(即“运行时单元”)最直接的方式,无需编写或保存 .service 文件。它特别适合快速启动一个带资源限制(如 CPU、内存、IO、进程数等)的短期任务。
基本语法与核心参数
systemd-run 本质是动态生成并启动一个 scope 或 service 类型的临时单元。默认行为是创建 scope 单元(适用于任意命令),更适合临时资源控制。
常用限制参数均以 --scope 模式生效(不加 --scope 时部分限制可能被忽略):
-
--scope:强制创建 scope 单元,确保所有资源限制生效 -
--property=KEY=VALUE:设置单元属性(推荐方式,比旧版--limit-*更通用) -
--scope必须放在命令和参数之间,不能放在最后
常用资源限制示例
以下命令启动一个受限的 sleep 300 进程(仅作演示,实际可替换为任何命令):
限制内存使用上限为 100MB:
systemd-run --scope --property=MemoryMax=100M sleep 300
限制 CPU 使用率不超过 50%(即 500ms/1s):
systemd-run --scope --property=CPUQuota=50% sleep 300
限制最多使用 4 个 CPU 核心(需配合 CPUAffinity 或 CPUQuota):
systemd-run --scope --property=CPUQuota=400% sleep 300
限制最大进程/线程数为 10:
systemd-run --scope --property=TasksMax=10 sleep 300
限制 IO 读写带宽(需 cgroup v2 + blkio controller 启用):
systemd-run --scope --property=IOReadBandwidthMax=/dev/sda:10M --property=IOWriteBandwidthMax=/dev/sda:5M dd if=/dev/zero of=/tmp/test bs=1M count=100
验证与调试方法
临时单元启动后,会输出类似 Running as unit: run-r1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7.service 的信息,可通过以下方式确认状态和限制:
- 查看单元状态:
systemctl status run-*.service(支持 tab 补全) - 查看实时资源使用:
systemd-cgtop(按 Ctrl+T 切换树状视图) - 查看具体 cgroup 属性:
systemctl show -p MemoryMax,CPUSchedulingPolicy,TasksMax run-*.service - 检查是否启用对应控制器:
cat /proc/cgroups,确认memory、cpu、pids等列为 1
注意事项与常见问题
某些限制在默认系统中可能不生效,原因包括:
- cgroup v1 环境下
MemoryMax不可用,应改用MemoryLimit(systemd v240+ 已弃用,建议升级或切换 cgroup v2) - 若系统未启用 cgroup v2,需在内核启动参数中添加
systemd.unified_cgroup_hierarchy=1并重启 -
--scope下无法使用Restart=等 service 特有选项;如需重启逻辑,应改用--unit=xxx.service并配合--property=设置 - 限制对子进程生效(继承 cgroup),但无法限制已存在的外部进程











