1 systemd-runコマンド
systemd-run
は、systemdを使用しているLinuxで、一時的にsystemdユニットを作成して実行できるコマンドである。
例:
# systemd-run sleep 60
このコマンドを実行すると、60秒待機するだけのserviceを生成し、systemdによってserviceが起動される。
通常のserviceと同じように管理されるので、たとえばsystemctl cat
コマンドでserviceの中身を見ることもできる。
$ systemctl cat run-re49ded26b30140fe9537410ece21c8e6.service
# /run/systemd/transient/run-re49ded26b30140fe9537410ece21c8e6.service
# This is a transient unit file, created programmatically via the systemd API. >
[Unit]
Description=/usr/bin/sleep 60
[Service]
ExecStart=
ExecStart="/usr/bin/sleep" "60"
プロセスが終了すると、生成されたserviceは自動的に削除される。
2 通常のコマンド実行のように実行する
systemd-run
を普通に実行すると、プロセスはsystemdによってバックグラウンドで実行され、出力はターミナルには直接表示されず、ログとして回収される(journalctl
コマンドで見られる)。
この動作は、デーモンとしてプロセスを実行させたいときには都合が良いが、気軽にコマンドを叩きたいときには不便なので、ここでは通常のコマンド実行のようになるようにオプションで動作を変えてみたい。
結論としては、以下のようにオプションを使用するのが便利だと思う。
$ systemd-run --user --scope --quiet --same-dir コマンド
各オプションについて
- --user ユーザー側のsystemdを使用する。これによりユーザー権限でコマンドを実行できる。
- --scope serviceを作成せず、コマンドはユーザーセッションから直接実行される。scopeを一時的に作成し、実行したプロセスはそのscopeに登録される。
- --quiet systemd-runコマンドの出力を抑制する。
- --same-dir コマンドの実行ディレクトリをカレントディレクトリにする。
3 リソースを制限する
systemd-run
コマンドでは、-p
オプションを使ってリソース制限の設定をすることができる。
なお、プロセス内で他のプロセスを起動した場合、その子プロセスも自動的に管理下に入る。(その場合、親と子プロセスの合計値が制限されることになる)
主な設定
設定 | 効果 |
---|---|
MemoryHigh=bytes | 最大使用メモリを指定する。単位としてK, M, G, Tが使える。 メモリ制限を超過してもプロセスは停止せず、実行が非常に遅くなる。 |
MemoryMax=bytes | 上のMemoryHighと同様だが、メモリ制限を超過するとプロセスが停止する。 |
CPUQuota= | 単位として「%」をつけて指定する。CPUの使用量を制限する。 複数のCPUを使いたいときは100%より大きい値を指定する。 |
TasksMax=N | プロセス数の最大値を指定する。 |
IOReadBandwidthMax=device bytes | 指定したdeviceに対するI/Oの読み込み速度(一秒単位)を制限する。 バイトの指定にはK, M, G, Tが使える。 |
IOWriteBandwidthMax=device bytes | 上記と同様に、I/Oの書き込み速度を制限する。 |
たとえば、メモリ使用量を500MBに制限してコマンドを実行したい場合は以下のようになる。
$ systemd-run --user --scope --quiet --same-dir -p MemoryMax=500M コマンド
参考リンク
https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html
https://www.freedesktop.org/software/systemd/man/latest/systemd-run.html