systemd-runとは

systemd-runは、指定したコマンドをtransient unit(一時的なUnit)として実行するコマンドである。

通常、systemdのサービスとしてコマンドを動かすにはUnitファイルを作成してsystemctl startする必要がある。systemd-runを使うとUnitファイルを作成せずにコマンド1つでサービス化でき、cgroupによるリソース制限やjournaldへのログ集約といったsystemdの機能をその場で使える。

使い方

以下の構文で実行する。

$ systemd-run [オプション] コマンド

動作確認

Dockerコンテナ上でsystemdを動かし、動作を確認する。

ユニット名を指定せずに実行する

--unitを指定せずに実行すると、ランダムな名前のユニットとして実行される。

$ systemd-run /bin/sleep 30
Running as unit: run-r8c05e05952634f5f8686229a662d1d60.service

ユニット名を指定して実行する

--unitオプションでユニット名を指定できる。

$ systemd-run --unit=hello-demo /bin/sleep 30
Running as unit: hello-demo.service

systemctl statusで通常のサービスと同様に状態を確認できる。

$ systemctl status hello-demo
● hello-demo.service - /bin/sleep 30
     Loaded: loaded (/run/systemd/transient/hello-demo.service; transient)
  Transient: yes
     Active: active (running) since Sat 2026-07-11 12:56:08 UTC; 1s ago
   Main PID: 62 (sleep)
      Tasks: 1 (limit: 37550)
     Memory: 276.0K (peak: 512.0K)
        CPU: 993us
     CGroup: /docker/e1c73d084eee7eec9fee3eb0274a7ef69b498304f1a81c6bcf0c1c9ac4dd5dd8/system.slice/hello-demo.service
             └─62 /usr/bin/coreutils --coreutils-prog-shebang=sleep /bin/sleep 30

Jul 11 12:56:08 e1c73d084eee systemd[1]: Started /bin/sleep 30.

Transient: yesと表示されており、Unitファイルを作成せずに実行されたサービスであることが分かる。実行が終了すると、このtransient unitは自動的に破棄される。

ログを確認する

標準出力・標準エラー出力はjournaldに送られるため、journalctl -uで確認できる。

$ systemd-run --unit=hello-demo /bin/sh -c "echo hello from systemd-run"
Running as unit: hello-demo.service

$ journalctl -u hello-demo --no-pager
Jul 11 12:56:00 e1c73d084eee systemd[1]: Started /bin/sh -c echo hello from systemd-run.
Jul 11 12:56:00 e1c73d084eee sh[43]: hello from systemd-run
Jul 11 12:56:01 e1c73d084eee systemd[1]: hello-demo.service: Deactivated successfully.

リソース制限をかけて実行する

-p--property)オプションで、Unitファイルの[Service]セクションに指定するようなプロパティをその場で渡せる。以下は使用メモリの上限を50MBに制限して実行する例。

$ systemd-run --unit=mem-demo -p MemoryMax=50M /bin/sleep 30
Running as unit: mem-demo.service

$ systemctl show mem-demo -p MemoryMax
MemoryMax=52428800

MemoryMax=52428800(50MiB)が反映されており、コマンド単位でリソース制限をかけて実行できることが分かる。メモリ使用量が想定を超えるコマンドを本番相当の制限下で試したい場合などに利用できる。

–scopeでサービスマネージャを介さず実行する

デフォルトのsystemd-runはコマンドをsystemdのサービスマネージャ配下で実行し、即座にプロンプトへ制御を返す。一方、--scopeオプションを付けると、コマンドはsystemd-run自身の子プロセスとして直接実行され、フォアグラウンドで動作が完了するまでブロックする。

$ systemd-run --scope --unit=scope-demo /bin/sleep 30
Running scope as unit: scope-demo.scope

scopeもservice同様にcgroupが作成され、リソース制限や監視の対象になる。ただし、プロセスの起動と監視をsystemd-run自身が担う点でserviceと異なる。シェルから対話的に実行しているコマンドに後からリソース制限をかけたい場合などに向いている。

ユースケース

  • 重い処理を本番相当のリソース制限下で一時的に試したい
  • cronやUnitファイルへ登録する前に、サービスとして正しく動作するか確認したい
  • 常駐させたいコマンドをUnitファイルなしでとりあえず動かしてみたい

いずれもUnitファイルを作成せずに済むため、恒久的なサービス化の前段階の検証に向いている。