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.target
の Wants
が増減したとき)、systemctl restart
だけだと反映されないので停止→開始する必要があります。
systemctl daemon-reload systemctl stop worker.target systemctl start worker.target