私はcgroups v2(統合)階層を実行しているマシンを持っているため、systemdはすべてのcgroupの管理とsystemdユーザーインスタンスへの委任を担当しています。プロセスのグループに対して resource control を実行したいので、それらを1つの単位にまとめる必要があります—おそらく systemdスコープ です。
通常、systemd-run
がこれを実行します—残念ながら、これらのプロセスはすでに実行されており、再起動したくありません。
既存のプロセスから systemdスコープ を作成するにはどうすればよいですか? Control Group Interface のドキュメントにはそれが可能であると記載されていますが、コマンドラインから方法を見つけることができませんでした。 systemctl
もsystemd-run
もこれを行うことができないようです。
コマンドラインからの方法はありますか?必要に応じて、systemd v241を実行しています。
Dbus呼び出しを行うためのさまざまなコマンドラインツールがあります。 systemdにはbusctl
と呼ばれるものが付属しています。したがって、コマンドラインからStartTransientUnit
を呼び出すことができます。
構文は明らかに面倒ですが、次のようになります(1つのプロセスID 14460の場合)。
busctl call --user org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager StartTransientUnit 'ssa(sv)a(sa(sv))' \
'SCOPE-NAME.scope' fail 1 PIDs au 1 14460 0
それは明確に不透明です(そして、正しくなるようにいくつかの試みを行い、最終的にdbus-monitor
を参照してくださいsystemd-run
やりました—ただし、システムマネージャー上でのみ、systemd-run --user
はdbusを通過しないようです)。したがって、パラメータごとの説明:
busctl call --user # use user session dbus, not system
org.freedesktop.systemd1 # dbus service name
/org/freedesktop/systemd1 # dbus object in that service
org.freedesktop.systemd1.Manager # interface name in that service
StartTransientUnit # method we're going to call
'ssa(sv)a(sa(sv))' # signature of method, see below
'SCOPE-NAME.scope' # first argument, name of scope
fail # second argument, how to handle conflicts (see below)
1 # start of third argument, number of systemd properties for unit
PIDs # name of first property
au # data type of first property, (a)rray [aka list] of (u)nsigned integers
1 # count of array — that is, number of pids
14460 # first pid
0 # fourth argument: array size=0 (unused parameter)
コマンドに追加する
ユニットに別のsystemdプロパティを追加するには、プロパティの数を増やして追加します。各プロパティは、少なくとも3つの追加のコマンドライン引数(キー、値タイプ、値)であることに注意してください。例として、Sliceプロパティを追加すると、次のようになります。
… fail 1 PIDs au 1 14460 0
に
… fail 2 PIDs au 1 14460 Slice s whatever.slice 0
^ ^^^^^ ^ ^^^^^^^^^^^^^^
count key type value
タイプ「s」は文字列です。それらのリストは D-Bus仕様の「タイプシステム」の章 にあります。
もちろん、カウントを3に変更して、3番目のプロパティを追加できます。等。
他のプロパティに似ていますが、今回は「PIDs」プロパティ値の中に埋め込まれたカウントです。例はそれをより明確にする必要があります:
… fail 1 PIDs au 1 14460 0
なる
… fail 1 PIDs au 2 14460 14461 0
^ ^^^^^
internal count second pid
pID 14461および14460を追加した場合。
同じ方法で、3番目、4番目などのPIDを追加できます。
もちろん、追加のプロパティを追加のPIDと組み合わせることができます。 pidのリストはプロパティ値であるため、一緒に存在する必要があることに注意してください。 pid引数を他のプロパティと混在させることはできません。正しい方法は変更することです:
… fail 1 PIDs au 1 14460 0
に:
… fail 2 PIDs au 2 14460 14461 Slice s whatever.slice 0
(順序は関係ありません。SIDブロックをPIDブロックの前に置くことができます)。
署名は systemd dbus APIのドキュメント から取得するか、おそらくより簡単に、dbusイントロスペクションを使用して取得します。
$ busctl introspect org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager | grep1 StartTransientUnit
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.StartTransientUnit method ssa(sv)a(sa(sv)) o -
(ために grep1
、参照 https://unix.stackexchange.com/a/279518 )
ここには、180を超えるメソッドとdbus-propertiesが多数リストされています。したがって、grep
を省略しないでください。
systemd documentation (「CreateUnit」の下を参照)によると、有用な値はfail
およびreplace
です。 fail
は、競合が発生した場合にスコープが起動しないことを意味します。 replace
は、systemdが競合するユニットを取り除くことを意味します。これは、現在開始またはスケジュールされている(「キューに入れられている」と表示されている)ユニットにのみ当てはまることに注意してください。たとえば、replaceは、既に実行中のスコープを同じ名前で置き換えません。