私の組織には、キューを消費するワーカー プロセスが多数あります。現在、それらを管理するために 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