SystemD に N 個のプロセスを生成しますか?

SystemD に N 個のプロセスを生成しますか?

私の組織には、キューを消費するワーカー プロセスが多数あります。現在、それらを管理するために SupervisorD を使用していますが、特定の利点があるため、可能であれば SystemD を使用したいと考えています。カスタム ユニットの作成には十分な経験がありますが、SystemD の領域でこれに相当するものがすぐには見つかりません。

の中にSupervisorD ドキュメントと呼ばれるパラメータnumprocsが詳細化されており、これを使用すると、サービスで開始するプロセスの数を設定できます。30 個のプロセスを開始したい場合は、1 行変更するだけです。

SystemD ユニットには、開始するプロセスの数を指定できる設定がありますか?

答え1

Munir が述べたのが、まさにその方法です。基本的には、serviceファイルを作成し、それを 30 回起動します。これは少し扱いに​​くいように思えるかもしれませんが、動作がおかしい場合に 1 つをシャットダウンすれば、すべてをシャットダウンする必要がないなどの利点があります。管理を容易にするために実行できる操作もいくつかあります。

まず、ユニットファイルです。 のようなファイルを作成します。重要なのはシンボルです。/etc/systemd/system/[email protected]@

内容は次のようになります。

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

次に、 で起動します。 起動されるプロセスは次のようになります。systemctl start [email protected]systemctl start [email protected]

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

開始時%Iに の後に付けた内容で が置き換えられることに注意してください。@

30 個すべてをちょっとしたシェル フーで開始できます。

systemctl start test@{1..30}.service

通常のサービスと同様に、起動時に有効にすることもできます。systemctl enable [email protected]

 

さて、管理を容易にするためにできることとは、つまり、test@{1..30}.serviceすべてを管理するために を使用したくないかもしれないということです。それは少し扱いに​​くいです。代わりに、サービスに新しいターゲットを作成することができます。

作成する/etc/systemd/system/test.target:

[Install]
WantedBy=multi-user.target

次に、次のように調整します。/etc/systemd/system/[email protected]

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

で systemd をリロードしますsystemctl daemon-reload(ユニット ファイルを変更していて、以前のバージョンをスキップしていない場合にのみ必要です)。次に、 を実行して、管理するすべてのサービスを有効にしますsystemctl enable test@{1..30}.service
(以前にサービスを有効にしていた場合はWantedBy=multi-user.target、依存関係を解消するためにまず無効にしてください)

これで、systemctl start test.targetと を実行するsystemctl stop test.targetと、30 個のプロセスすべてが開始/停止されます。
また、他のユニット ファイルと同様に、起動時に を有効にできますsystemctl enable test.target

答え2

以下は、virtualenv で実行される Python スクリプトを使用した例です。

/etc/systemd/system/[email protected]

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

無効にする:sudo systemctl disable my-worker\@{1..30}.service

N 人のワーカーを有効にする:sudo systemctl enable my-worker\@{1..2}.service

リロード:sudo systemctl daemon-reload

始める:sudo systemctl start [email protected]

ステータスを確認:sudo systemctl status my-worker@1

関連情報