SystemDはNプロセスを生成しましたか?


12

私の組織では、多くのキューを使用するワーカープロセスがあります。現在、SupervisorDを使用してそれらを管理していますが、可能であればSystemDを使用して特定の利点を実現したいと考えています。私はカスタムユニットの作成にかなりの経験がありますが、このためにSystemDランドにすぐにアナログを持っていません。

SupervisorDのドキュメントと呼ばれるパラメータがnumprocs1は、彼らがサービスを開始することがしたいプロセスの数を設定することを可能にする詳述されています。30個のプロセスを開始したい場合は、1行の変更です。

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


1
同じユニットの複数のインスタンスを作成しようとしていますか?もしそうなら、0pointer.de / blog / projects / instances.html
ムニール

回答:


30

ムニールが言ったことは、まさにあなたがこれを行う方法です。基本的にserviceファイルを作成し、30回起動します。これは少し厄介に思えるかもしれませんが、動作に問題がある場合はそれらの1つをシャットダウンでき、すべてをシャットダウンする必要がないなどの利点があります。管理を簡単にするためにできることもいくつかあります。

まず、ユニットファイル。などのファイルを作成します/etc/systemd/system/test@.service。重要なビットは@シンボルです。

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

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

[Install]
WantedBy=multi-user.target

その後でそれを起動しsystemctl start test@1.servicesystemctl start test@2.service
起動されるプロセスは次のようになります。

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 test@1.service

 

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

で作成/etc/systemd/system/test.target

[Install]
WantedBy=multi-user.target

次に、/etc/systemd/system/test@.service次のように調整します。

[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.targetsystemctl stop test.target、それはすべての30個のプロセスを開始/停止します。
繰り返しになりますが、他のユニットファイルと同様に起動時に有効にできますsystemctl enable test.target


この詳細な回答をありがとう、私はこれを数日間検索しました。
アルノレム

1
それが失敗したプロセスを再起動するかどうか知っていますか?
バスティアン

@bastian:を使用できますRestart=on-failure。詳細については、systemd.servicemanページをご覧ください。
-siride

1

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

/etc/systemd/system/my-worker@.service

[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 my-worker@2.service

ステータスを確認します。 sudo systemctl status my-worker@1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.