私の組織では、キューを消費するワーカープロセスが多数あります。現在、SupervisorDを使用して管理していますが、SystemDを使用して、特定の利点を実現したいと考えています。私はカスタムユニットを書くのにかなりの経験がありますが、SystemDランドにこれのためのアナログがすぐにありません。
SupervisorDのドキュメント には、numprocs
というパラメーターが詳細に記載されており、サービスで開始するプロセスの数を設定できます。 30プロセスを開始したい場合は、1行の変更です。
SystemDユニットに、開始したいこれらのプロセスの数を指定できる設定はありますか?
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
は、開始時に@
の後に置いたものに置き換えられていることに注意してください。
少しのShell-fuで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
。
以下は、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 enable 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