私たちの組織にはワーカープロセスを使用するキューがたくさんあります。現在はSupervisorDを使用して管理していますが、可能であればSystemDを使用してこれらの利点のいくつかを取得したいと思います。私はカスタムユニットを書くのにかなり経験がありましたが、SystemDの世界で同様のものをすぐに見つけることができませんでした。
内部にSupervisorDドキュメント「detailed」というパラメーターを使用する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
30systemctl stop test.target
のプロセスがすべて起動/停止されます。
同様に、他のユニットファイルのように起動時に有効にすることができます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