私が解決しようとしている問題は、カスタムサービスを開始または停止するときにリスナーサービスを開始および停止することです。具体的な例はRHEL7のIBM MQ V8ですが、Oracle DBやリスナーなどにも同じ原則を適用する必要があります。
リスナーサービスはメインサービスの後に開始し、メインサービスの前に停止する必要があります。
私は自分のシステム単位ファイルを回答として公開する予定ですが、回答を改善するために別の回答を探しています。
答え1
主なサービス/etc/systemd/system/[Eメール保護]として定義された:
[Unit]
Description=IBM MQ V8 QM %i
Requires=qm-listener@%i.service
Before=qm-listener@%i.service
[Service]
Type=forking
User=mqm
Group=mqm
ExecStart=/opt/mqm/bin/strmqm %i
LimitNOFILE=10240
LimitNPROC=4096
ExecStop=/opt/mqm/bin/endmqm %i
KillMode=none
[Install]
WantedBy=multi-user.target
リスニングサービス/etc/systemd/system/[Eメール保護] として定義された:
[Unit]
Description=IBM MQ V8 %i Listener
PartOf=qm@%i.service
[Service]
Type=simple
User=mqm
Group=mqm
ExecStart=/opt/mqm/bin/runmqlsr -t TCP -m %i
LimitNOFILE=10240
LimitNPROC=4096
ExecStop=/opt/mqm/bin/endmqlsr -m %i
KillMode=none
[Install]
WantedBy=multi-user.target
使っていますテンプレート機能単一ユニットファイルを使用して複数のキューマネージャを管理できます。キュー・マネージャーQM1を開始する実際のコマンドは次のとおりです。
$ sudo systemctl start qm@QM1
これにより、qm@QM1 および qm-listener@QM1 サービスがインスタンス化され開始されます。
このコンテンツを制作しながら学んだ追加の注意事項は次のとおりです。
- タイプが分岐しました。[Eメール保護]実際のqmgrプロセスをフォークした後、strmqmコマンドが終了するためです。[Eメール保護]runmqlsr プロセスがメインプロセスであるため、タイプは簡単です。
- systemd はデフォルトで ExecStop コマンドを実行した後、cgroup のすべてのプロセスに SIGTERM を送信するため、KillMode なしが必要です。 MQはSIGTERMを受信するとエラーを発生させます。
- MQ が PIDfile を生成しないため、PIDfile は指定されていません。指定された場合、systemd は起動が失敗したと見なします。
- /etc/security/limits.conf または /etc/security/limits.d/*conf で定義された制限は pam ログインセッションにのみ適用され、systemd によって開始されたサービスは pam ログインセッションで実行されないため、LimitNOFILE および LimitNPROC が追加されました。
- リスナーのPartOfは、対応するqmサービスが停止したときに停止することを保証します。
PartOfオプションが正しい選択かどうかはわかりません。