シャットダウン直前にsystemdサービスを開始する

シャットダウン直前にsystemdサービスを開始する

私は postgresql データベース用の systemd シャットダウン スクリプト (ユニット ファイル) を開発しており、以下の 2 つの投稿に従いましたが、動作しませんでした。

シャットダウン直前に systemd でスクリプトを実行するにはどうすればいいですか?

https://superuser.com/questions/1016827/how-do-i-run-a-script-before-everything-on-shutdown-with-systemd でシャットダウン時に他のすべてのスクリプトを実行する方法

私が postgresql インストールで行っていることは次のとおりです。起動時に postgresql データベース クラスターを起動する起動スクリプトを作成しましたが、以下に示すシャットダウン スクリプトはシャットダウン時に機能しないようです。systemctl start service_name で実行すると正常に機能します。

データベース ログを見ると、「LOG: スマート シャットダウン要求を受信しました」というメッセージが表示されました。これは、データベース クラスターが通常モードでダウンしたときに表示されるメッセージで、ホストを「shutdown -h now」でシャットダウンしたときにオペレーティング システムがシャットダウンするものです。私が見たいのは、「LOG: 高速シャットダウン要求を受信しました」です。これは、systemctl start service_name でスクリプトを実行したときに発生する高速 (即時モード) シャットダウンです。

ユニットファイルの定義は次のとおりです

[Unit]
Description=Database Shutdown
Before=shutdown.target reboot.target halt.target
DefaultDependencies=no
[Service]
ExecStart=/usr/bin/su - postgres -c "/opt/postgres-95/bin/pg_ctl -D /database/inst1/data -w stop &"
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target

私も[Install]セクションを削除しようとしましたが、systemctl ではセクションなしでサービスを有効にできませんでした[Install]。どなたか正しい方向を示していただけませんか。

答え1

systemdは、このケースをきれいに処理するように設計されています。PostgreSQL サービスの停止の一部として実行するコマンドを指定する小さなファイルを作成することで、これを実行できます。まず、次の名前のディレクトリを作成します。

/etc/systemd/system/postgresql.d/

.confその中に、のように で終わる任意の名前のファイルを作成しますcustom-shutdown.conf。そのファイルに次のような行を数行追加します。

[Service]
ExecStop=/usr/bin/su - postgres -c "/opt/postgres-95/bin/pg_ctl -D /database/inst1/data -w stop &" 

ExecStopPost=状況に応じて使い分けるとよいでしょう。

公式ドキュメントを参照デフォルト設定の拡張また、公式ドキュメントもExecStop=そしてExecStopPost=

関連情報