web-dev-qa-db-ja.com

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

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

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

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

13
Naftuli Kay

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

31
Patrick

以下は、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

1
radtek