web-dev-qa-db-ja.com

コマンドラインから既存のプロセスのsystemdスコープを作成するにはどうすればよいですか?

私はcgroups v2(統合)階層を実行しているマシンを持っているため、systemdはすべてのcgroupの管理とsystemdユーザーインスタンスへの委任を担当しています。プロセスのグループに対して resource control を実行したいので、それらを1つの単位にまとめる必要があります—おそらく systemdスコープ です。

通常、systemd-runがこれを実行します—残念ながら、これらのプロセスはすでに実行されており、再起動したくありません。

既存のプロセスから systemdスコープ を作成するにはどうすればよいですか? Control Group Interface のドキュメントにはそれが可能であると記載されていますが、コマンドラインから方法を見つけることができませんでした。 systemctlsystemd-runもこれを行うことができないようです。

コマンドラインからの方法はありますか?必要に応じて、systemd v241を実行しています。

3
derobert

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番目のプロパティを追加できます。等。

その他のPID

他のプロパティに似ていますが、今回は「PIDs」プロパティ値の中に埋め込まれたカウントです。例はそれをより明確にする必要があります:

… fail 1 PIDs au 1 14460 0

なる

… fail 1 PIDs au 2 14460 14461 0
                 ^       ^^^^^
         internal count  second pid

pID 14461および1446​​0を追加した場合。

同じ方法で、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は、既に実行中のスコープを同じ名前で置き換えません。

4
derobert