systemdを使用して終了時にPostgresql ExecStopコマンドを実行したいと思います。

systemdを使用して終了時にPostgresql ExecStopコマンドを実行したいと思います。

Postgresql起動時に継続的に実行されるスクリプトセットがあります。データベースが閉じる前に特別なスクリプトを実行して、これらのスクリプトを停止して完了するのを待つようにファイルExecStopのコマンドを変更しました。.serviceすべて動作します。

ただし、昨日はIT部門でサーバーをシャットダウンし、ExecStopコマンドは実行されませんでした。スクリプトに混乱が生じ、特定のスクリプトが出力をファイルに書き込むときに、そのファイルが昨日更新されなかったため、これを知っています。

注: 先ほど root ユーザーの履歴を確認したところ、IT が逃げたようです。

shutdown -h now

これはsystemctl設定をバイパスしますか?

.serviceシステムのシャットダウン時に実行されるようにファイルに何かを追加できますかExecStop?それとも特別な終了関連サービスを作成する必要がありますか?

既存のPostgresqlサービスを複製する特別なサービスを作成したくないので、これは「systemdを使用して終了する前にスクリプトを実行する方法」と重複しないと思います。

私は特定のスクリプトが実行されている間にログファイルに追加されるため、実行されていないと確信しています。提供する ' 。

サービスファイルは次のとおりです。

[Unit]
Description=PostgreSQL 9.3 main database server
After=syslog.target
After=network.target

[Service]
Type=forking

User=postgres
Group=postgres

# Location of database directory
Environment=PGDATA=/db_tier1/main/

ExecStartPre=/usr/pgsql-9.3/bin/postgresql93-check-db-dir ${PGDATA} ; /bin/rm -f /db_tier2/PGSERVICE-PROD-ABORT
ExecStart=/usr/pgsql-9.3/bin/pg_ctl start -D ${PGDATA} -s -w -t 300
ExecStop=/bin/sh /var/lib/pgsql/bin/PROD/run_db_pre_stop.sh ${PGDATA} ; /usr/pgsql-9.3/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/pgsql-9.3/bin/pg_ctl reload -D ${PGDATA} -s

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=600

[Install]
WantedBy=multi-user.target

ベストアンサー1

systemdはシャットダウン中に停止したすべてのサービスを実行するため、ExecStop=スクリプトははい処刑されています。

一般的な問題は、サービスユニット(この場合postgresql.service)にすべての依存関係が正しく設定されていないことです。この場合、他のシャットダウンプロセス(ネットワークシャットダウンやファイルシステムのマウント解除など)がスクリプトと同時に発生する可能性があります。

ExecStop=スクリプトが完了するまでこれらの項目が十分に長く持続するようにするには、After=サービスの依存関係にそれらをリストする必要があります。 (終了順序は開始順序と逆であるため、サービスが停止します。今後これらの依存関係の中断。 )たとえば、停止After=network.targetスクリプトでネットワーキングを設定する必要がある場合。

ルートディレクトリではなくファイルシステムに書き込むには、次のようにします。RequiresMountsFor=手術中も使用できるようにします。

ログがあり、永続ストア(可能であると思う)がある場合は、その内容を見て、スクリプトが言及されているか、ExecStop=スクリプトの実行中に発生したエラーがいくつかあるかどうかを確認できます。

たとえば、次のコマンドは次のようになります。

$ journalctl -u postgresql -b -1

postgresql.serviceこれは、マシンの最後の起動(現在の起動前の起動を意味します)のすべてのログを一覧表示します-b -1(サービスデバイスの正確な名前であると仮定)。したがって、起動時に開始し、終了時に停止するようにマークする必要があります。これが問題解決に役立つことを願っています。

おすすめ記事