概要
systemd-run は、コマンドを systemd の制御下で実行し、そのコマンドが独立した systemd ユニット(unit)として動作するようにします。これにより、プロセスグループ管理、リソース制限、ロギング統合など、systemd の強力な機能を活用できます。
主な特徴
- 一時的なスコープまたはサービスユニットの作成
- プログラムのリソース制限と優先順位の設定
- シェルセッション終了後もバックグラウンド実行(サービスユニットの場合)
- systemd ジャーナルによる統合ロギング
- コンテナおよび仮想マシン内でのコマンド実行
主なオプション
systemd-run は、さまざまなオプションを通じて、実行されるプログラムの環境と systemd ユニットの属性を制御できます。
ユニットタイプと名前
実行制御と環境
生成されたコマンド:
コマンドを組み合わせてみてください。
説明:
`systemd-run` コマンドを実行します。
これらのオプションを組み合わせて、AIと一緒に仮想的にコマンドを実行してみてください。
使用例
systemd-run コマンドを活用した様々な使用例です。
基本的なスコープユニットでコマンド実行
systemd-run --scope echo "Hello from systemd-run"
簡単なコマンドを一時的なスコープユニットとして実行します。このコマンドは systemd-run が終了するまで実行されます。
バックグラウンドサービスユニットでコマンド実行
systemd-run --service --unit=my-long-task.service sleep 300
シェルセッションが終了しても実行し続けるバックグラウンドサービスを作成します。`--unit` でサービス名を指定します。
CPU 優先順位とメモリ制限の設定
systemd-run --nice=10 --property=MemoryLimit=500M stress --cpu 4
実行されるプログラムの CPU 優先順位を下げ(nice=10)、メモリ使用量を 500MB に制限します。
特定の作業ディレクトリでコマンド実行
systemd-run --working-directory=/tmp bash -c 'pwd; touch testfile.txt'
コマンドを `/tmp` ディレクトリで実行するように設定します。
シェルを介してパイプラインコマンド実行
systemd-run --shell echo "Hello" | cat
パイプ(|)やリダイレクション(>)などのシェル機能を使用するには、`--shell` オプションを使用する必要があります。
ユーザーユニットでコマンド実行
systemd-run --user --scope echo "User-specific task"
現在のユーザーの systemd インスタンスでユニットを作成して実行します。システム全体には影響しません。
ヒントと注意点
systemd-run 使用時の役立つヒントと注意点です。
スコープ vs サービスユニット
スコープユニット(`--scope`)は `systemd-run` コマンドが実行されている間のみ有効であり、親プロセスに依存します。サービスユニット(`--service`)は `systemd-run` コマンドが終了してもバックグラウンドで独立して実行されます。バックグラウンドタスクには `--service` を使用するのが一般的です。
- `--scope`: 親プロセスに依存、`systemd-run` 終了時に一緒に終了
- `--service`: 独立したバックグラウンド実行、`systemd-run` 終了後も維持
ユニットの状態確認と管理
systemd-run で作成されたユニットの状態は `systemctl` コマンドで確認できます。サービスユニットは `systemctl stop` などで停止できます。
- 状態確認: `systemctl status <unit_name>`
- サービス停止: `systemctl stop <unit_name>`
- ログ確認: `journalctl -u <unit_name>`
リソース制限の活用
`--property` オプションを使用して、CPU、メモリ、I/O など様々なリソースを制限できます。これはシステム安定性を高め、特定のプロセスが過剰にリソースを使用するのを防ぐのに非常に効果的です。
シェル機能使用時の `--shell`
コマンドにパイプ(|)、リダイレクション(>)、バックグラウンド実行(&)などのシェルの特殊機能が含まれる場合、必ず `--shell` オプションを使用してコマンドがシェルを介して解釈されるようにする必要があります。そうしないと、コマンドが正しく実行されない可能性があります。