注文する

注文する

cgroups v2(統合)階層を実行するコンピュータがあるため、systemdはすべてのcgroupを管理し、systemdユーザーインスタンスにタスクを委任します。公演したい資源管理一連のプロセスに適用されるため、これを1つの単位にまとめる必要があります。システム全体

一般的にsystemd-runこれを行うことができます。しかし、残念ながら、これらのプロセスはすでに実行中であるため、再起動したくありません。

どうやって作れますか?システム全体既存のプロセスでは?これコントロールグループインターフェースドキュメントはこれが可能であることを示していますが、コマンドラインでは方法が見つかりません。どちらもこれを行うことができないsystemctlようです。systemd-run

コマンドラインから方法がありますか?重要な場合は、systemd v241を実行しています。

ベストアンサー1

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確認するために使用されましたが、dbusを介してではなくsysmanagerでのみ使用されるようです)。したがって、パラメータごとに説明すると、次のようになります。systemd-runsystemd-run --user

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)

コマンドに追加

その他の宿泊施設

デバイスに別のシステム属性を追加するには、属性の数を増やして追加する必要があります。各プロパティは、キー、値タイプ、値という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

追加の属性と似ていますが、今回は「PID」属性の値に隠された数です。たとえば、より明確になります。

… 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

(順序は重要ではありません。PIDブロックの前にSliceブロックを配置できます。)

署名はどこから来ますか?

署名は以下から取得できます。systemddbus 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プロパティがリストされています。だから省略しないでくださいgrep

紛争に対処するために「失敗」することはどういう意味ですか?また何がありますか?

~によるとシステム文書(「CreateUnit」の下を参照)有用な値failはとですreplacefailつまり、競合がある場合、範囲は開始されません。replacesystemdが衝突するユニットを削除することを意味します。これは、現在実行中または予約されているデバイス(「待機中」と表示されている)にのみ適用されるようです。たとえば、置換はすでに実行されている範囲を同じ名前に置き換えません。

おすすめ記事