systemd のテンプレートユニットで同じプロセスを複数立ち上げる

systemd で同じプロセスを複数立ち上げる方法。Supervisord なら numprocs を指定するだけですけど systemd には相当する設定項目がありません。

ので、テンプレートユニットを使って、1つのユニットファイルを元に複数のプロセスを立ち上げます。

worker@.service

[Unit]
After=network.target

[Service]
ExecStart=/path/to/ore-no-worker
Restart=always

[Install]
WantedBy=multi-user.target

ただ、これだとプロセスの数だけ複数回コマンドを打つ必要があって煩雑ですね。

systemctl start worker@1.service && systemctl enable worker@1.service
systemctl start worker@2.service && systemctl enable worker@2.service
systemctl start worker@3.service && systemctl enable worker@3.service
systemctl start worker@4.service && systemctl enable worker@4.service
systemctl start worker@5.service && systemctl enable worker@5.service
systemctl start worker@6.service && systemctl enable worker@6.service
systemctl start worker@7.service && systemctl enable worker@7.service
systemctl start worker@8.service && systemctl enable worker@8.service

次のようにターゲットユニットを使えばスッキリします。

worker@.service

[Unit]
After=network.target
PartOf=worker.target

[Service]
ExecStart=/path/to/ore-no-worker
Restart=always

[Install]

worker.target

[Unit]
Wants=worker@1.service
Wants=worker@2.service
Wants=worker@3.service
Wants=worker@4.service
Wants=worker@5.service
Wants=worker@6.service
Wants=worker@7.service
Wants=worker@8.service

[Install]
WantedBy=multi-user.target

次のようにまとめて管理できます。

# 開始
systemctl start worker.target

# リスタート
systemctl restart worker.target

# 停止
systemctl stop worker.target

# 自動起動
systemctl enable worker.target

プロセス数が変わったとき(worker.targetWants が増減したとき)、systemctl restart だけだと反映されないので停止→開始する必要があります。

systemctl daemon-reload
systemctl stop worker.target
systemctl start worker.target