systemd-run はデフォルトでは service ユニットとしてコマンドを実行し、--scope オプションを指定すると scope ユニットとして実行する。
次の二つを確認する。
systemd-run で開始する service ユニットと scope ユニットの違い
systemd-run を使ってリソース制限をかけてコマンドを実行する方法
service ユニットは非同期に実行される
man systemd-run によると、
If a command is run as transient service unit, it will be started and managed by the service manager like any other service, and thus shows up in the output of systemctl list-units like any other unit.
It will run in a clean and detached execution environment, with the service manager as its parent process.
In this mode, systemd-run will start the service asynchronously in the background and return after the command has begun execution (unless –no-block or –wait are specified, see below).
systemd-run で開始した service ユニットは、 サービスマネージャーが親プロセスになる。
service ユニットは、実行元とは別の クリーンな環境で 、非同期に実行される。
scope ユニットは同期的に実行される
man systemd-run によると、
If a command is run as transient scope unit, it will be executed by systemd-run itself as parent process and will thus inherit the execution environment of the caller.
However, the processes of the command are managed by the service manager similar to normal services, and will show up in the output of systemctl list-units.
Execution in this case is synchronous, and will return only when the command finishes. This mode is enabled via the –scope switch (see below).
$ uname -a
Linux ip-172-31-45-104 5.3.0-1028-aws #30~18.04.1-Ubuntu SMP Mon Jun 22 15:48:21 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
1
2
$ mount | grep cgroup
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
service ユニットでコマンドを実行
1
2
$ sudo systemd-run echo'hello'Running as unit: run-r21673aa7f9594763bfbae30b99576796.service
service ユニットではコマンドはバックグラウンドで非同期に実行され、出力は journald に送られる。
journald のログを確認する。
1
2
3
4
$ journalctl -u run-r21673aa7f9594763bfbae30b99576796.service
-- Logs begin at Sat 2020-06-27 02:42:21 UTC, end at Sat 2020-06-27 06:26:50 UTC. --
Jun 27 06:26:50 ip-172-31-45-104 systemd[1]: Started /bin/echo hello.
Jun 27 06:26:50 ip-172-31-45-104 echo[2154]: hello
$ sudo systemd-run --unit testecho'hello'Running as unit: test.service
1
2
3
4
$ journalctl -u test-- Logs begin at Sat 2020-06-27 02:42:21 UTC, end at Sat 2020-06-27 06:32:21 UTC. --
Jun 27 06:32:21 ip-172-31-45-104 systemd[1]: Started /bin/echo hello.
Jun 27 06:32:21 ip-172-31-45-104 echo[2201]: hello
scope ユニットで実行する
--scope オプションを指定すると scope ユニットで実行される。
1
2
3
$ sudo systemd-run --scope echo'hello'Running scope as unit: run-rad1d45d3d34f4ad195da49ce1c116b12.scope
hello
$ journalctl -u run-r84a4491781fb4b0b988e00e6d1079c15.service
-- Logs begin at Sat 2020-06-27 02:42:21 UTC, end at Sat 2020-06-27 06:37:15 UTC. --
Jun 27 06:37:15 ip-172-31-45-104 systemd[1]: Started /usr/bin/env.
Jun 27 06:37:15 ip-172-31-45-104 env[2243]: LANG=C.UTF-8
Jun 27 06:37:15 ip-172-31-45-104 env[2243]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Jun 27 06:37:15 ip-172-31-45-104 env[2243]: INVOCATION_ID=a948d55608804c40944184d48d045783
Jun 27 06:37:15 ip-172-31-45-104 env[2243]: JOURNAL_STREAM=9:28836