systemd-run是一个强大的命令行工具,用于创建并运行临时的 systemd 单元(如服务、作用域或定时器)。
它让你无需编写复杂的单元文件,就能直接利用 systemd 来管理一次性任务或临时脚本,并为其设置资源限制、依赖关系和日志记录等。
systemd-run是一个强大的 systemd 工具,用于创建并运行临时的 systemd 单元(unit),让你能将任意命令或脚本作为 systemd 服务来管理。
🎯 主要用途
它的核心价值在于,无需编写复杂的单元文件,就能让临时命令享受到 systemd 带来的完整功能,例如:
资源控制:为进程设置 CPU、内存等资源限制。
定时执行:创建一次性或周期性的定时任务-。
依赖与触发:基于文件路径变化、Socket 事件等条件来触发任务。
统一管理:使临时任务也能通过
systemctl等工具进行管理。
基本语法
systemd-run [选项...] 命令 [命令参数...]核心概念:两种主要运行模式
systemd-run默认以Service(服务)模式运行,但也可以通过--scope选项切换到Scope(作用域)模式,两者有显著区别。
| 特性 | Service 模式 (默认) | Scope 模式 (--scope) |
|---|---|---|
| 执行方式 | 异步:命令在后台运行,systemd-run立即返回。 | 同步:systemd-run会一直等待,直到命令执行完毕才退出。 |
| 执行环境 | 干净、隔离:由 systemd 作为父进程,不继承当前 shell 的环境。 | 继承当前环境:由systemd-run进程直接执行,因此会继承调用者的环境变量、工作目录等。 |
| 适用场景 | 运行需要脱离终端的长期后台任务或服务。 | 运行需要当前环境且希望看到实时输出的短期交互式命令或脚本。 |
注意:从 systemd 版本 206 开始支持
--scope选项。
⚙️ 工作原理与模式
systemd-run主要有三种工作模式:
默认模式(临时服务):创建一个临时的
.service单元。命令在独立、干净的环境中后台运行,systemd-run本身会很快退出。--scope模式(临时作用域):创建一个临时的.scope单元。命令会继承当前终端的环境,且systemd-run会同步等待命令执行完毕才退出。触发器模式(路径/套接字/定时器):不直接运行命令,而是创建一个
.path、.socket或.timer单元来在特定条件下触发执行。
常用选项详解
--unit=,-u:为单元指定一个自定义名称,代替自动生成的名称。--description=:为单元设置一个描述性的文本,方便识别。--property=,-p:这是最强大的选项,用于设置单元的各种属性。例如:-p CPUQuota=50%:限制 CPU 使用率为 50%。-p MemoryMax=1G:限制最大内存使用量为 1GB。-p Type=exec:确保命令真正启动成功后才返回。
--slice=:将单元放入指定的 slice(切片)中,用于资源分组管理。--remain-after-exit,-r:服务进程退出后,单元依然保持“已退出”状态,方便查看日志。--pty,-t:为命令分配一个伪终端(PTY),适合运行需要交互的命令。--quiet,-q:静默模式,不输出信息。--pipe:将systemd-run的标准输入/输出与服务的标准输入/输出连接起来。--no-block:默认服务是异步启动,此选项强制systemd-run不等待启动完成即返回。定时器相关选项:
--on-calendar=、--on-active=、--on-boot=等用于定义触发时间。--wait:等待服务单元停止后才退出。
实用示例
在后台运行一个长期任务(Service 模式)
这条命令会在后台运行一个休眠 60 秒的脚本。systemd-run会立即返回,而脚本会继续由 systemd 管理。systemd-run --unit=my-background-task /path/to/my-script.sh运行一个需要当前环境的命令(Scope 模式)
使用--scope和--collect选项,在当前 shell 环境中运行ping命令,并实时查看输出。当你按Ctrl+C时,systemd-run会退出。systemd-run --scope --collect ping 8.8.8.8限制资源使用
创建一个名为limited-task的服务,限制其最大内存使用量为 500MB。systemd-run --unit=limited-task -p MemoryMax=500M ./my-memory-hungry-app创建一个临时定时任务
创建一个服务,在 5 分钟后执行my-command。
systemd-run --on-active=5m my-command以特定用户身份运行
使用--uid=和--gid=选项指定运行命令的用户和组。systemd-run --uid=myuser --gid=mygroup my-command
注意事项
变量展开:systemd 服务管理器会对命令中的
$进行变量展开。如果需要使用字面意义的$,需要将其转义为$$。服务类型 (
Type):默认的服务类型是simple,这可能让systemd-run在命令实际启动前就返回成功。对于关键任务,建议使用--property=Type=exec来确保命令执行成功。
总而言之,systemd-run是将临时任务纳入 systemd 管理体系的“瑞士军刀”,无论是快速测试、资源限制还是定时任务,它都能提供极大的便利。