RHEL 7 systemdを終了/再起動する前に長いスクリプトを実行する方法

RHEL 7 systemdを終了/再起動する前に長いスクリプトを実行する方法

RedHat7でシャットダウン/再起動を開始する前にスクリプトを実行する方法の解決策を見つけたいと思います。サーバーをシャットダウンまたは再起動するときは、SAPデータベースを正しくシャットダウンする必要があります。

SAPシャットダウンスクリプトは3〜4分かかりますが、システムは非常に迅速にシャットダウンします。つまり、RedHat はすべてのプロセスをただちに終了します。

私のもの

systemd sap.service は次のようになります。

[Unit]
Description=Shutdown SAP
Before=shutdown.target reboot.target halt.target

[Service]
ExecStart=/bin/true
ExecStop=/usr/sap/stopsap
RemainAfterExit=true
KillMode=none

[Install]
WantedBy=multi-user.target

終了ログに示すように、データベースが正常に終了しませんでした。

Checking ADA Database
-------------------------------------------
setTrace: false
J2EE Database is not available

助けてください?

ありがとう

イボ

2015年10月21日に修正:

次のステップに進みます。うまくいきますが、まだ正しくありません。

[Unit] Description=SAP sluzba After=network.target sshd.target Wants=network.target sshd.service [Service] Type=simple RemainAfterExit=true Environment="SAPSYSTEMNAME=RH7" "HOST=cz-brn1-rh7" "HOME=/home/rh7adm" "PATH=/sapdb/clients/RH7/bin:/sapdb/programs/bin:/usr/lib64/qt-.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/usr/sap/RH7/SYS/exe/run:/home/rh7adm:." "DIR_LIBRARY=/usr/sap/RH7/SYS/exe/run" "LD_LIBRARY_PATH=/usr/sap/RH7/SYS/exe/run:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/sapdb/clients/RH7/lib" "RSEC_SSFS_DATAPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/data" "RSEC_SSFS_KEYPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/key" KillMode=none SendSIGKILL=no TimeoutSec=5min TimeoutStopSec=5min User=rh7adm Group=sapsys ExecStart=/usr/sap/startsap ExecStop=/usr/sap/stopsap
[Install] WantedBy=graphical.target

stopapスクリプトは次のとおりです。

#!/bin/bash date >> /usr/sap/stopsap.log; /usr/sap/RH7/SYS/exe/uc/linuxx86_64/stopsap >> /usr/sap/stopsap.log 2>&1; whoami >> /usr/sap/stopsap.log;

J2EE Database is running See logfile /home/rh7adm/JdbcCon.log stopping the SAP instance J28 Shutdown-Log is written to /home/rh7adm/stopsap_J28.log /usr/sap/RH7/J28/exe/sapcontrol -prot NI_HTTP -nr 28 -function Stop Instance on host cz-brn1-rh7 stopped Waiting for cleanup of resources..................................................................................................................................................

ここでは5分間停止します。終了スクリプトは完了しません。 :(

樹液がどのように閉じられるかを追跡できますか?提供する?

ありがとうございます..

答え1

TimeoutStopSecユニットファイルの値を変更してみてください。デフォルトは項目/etc/systemd/system.confに設定されていますDefaultTimeoutStopSec(私のシステムでは90秒に設定されています)。終了を完全に無効にするタイムアウトを設定するかTimeoutStopSec=0(スクリプトが終了しないと終了を中止する可能性があります)、スクリプトが完全に完了しないように大きな値を渡すことができます。

答え2

良い質問は環境にあります。

sap.service の正しい定義は次のとおりです。

[Unit] Description=SAP sluzba After=network.target sshd.target Wants=network.target sshd.service [Service] Type=simple RemainAfterExit=true Environment="HOSTNAME=cz-brn1-rh7" "SAPSYSTEMNAME=RH7" "HOST=cz-brn1-rh7" HOME=/home/rh7adm" PATH=/sapdb/clients/RH7/bin:/sapdb/programs/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/usr/sap/RH7/SYS/exe/run:/home/rh7adm:." "DIR_LIBRARY=/usr/sap/RH7/SYS/exe/run" "LD_LIBRARY_PATH=/usr/sap/RH7/SYS/exe/run:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/sapdb/clients/RH7/lib" "RSEC_SSFS_DATAPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/data" "RSEC_SSFS_KEYPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/key" KillMode=none SendSIGKILL=no TimeoutSec=5min TimeoutStopSec=5min User=rh7adm Group=sapsys ExecStart=/usr/sap/startsap ExecStop=/usr/sap/stopsap [Install] WantedBy=graphical.target

答え3

Oracle DBが終了する前にスクリプトを実行する必要があり、他の人がこの記事を見て解決策を見つける場合に備えて、ここで結果を共有する必要があると思いました。

私にとって、Oracleのoracle-ohasd.serviceはデータベースを完全にシャットダウンしていないようです。しかし、oracle dbが完全に終了したかどうかにかかわらず、oracle-ohasd.serviceを実行する前に、スクリプトでこのノードのDG切り替えとOEMブラックアウトを実行したいと思います。これが私がすることです。

2つのサービスを宣言しました。

WDOracle-shutdown.service - 事前終了スクリプトの実行を担当します。動作させるための鍵は、oracleによって提供された「oracle-ohsasd.service」に「Before = WDOracle-shutdown.service」を追加し、私のWDOracle-shutdown.serviceに「After = oracle-ohsasd.service」を追加することでした。です。 。 WDOracle-shutdown.serviceに「Before、Requires、およびRequiresMountsFor」が必要な場合がありますが、oracleによって提供された「oracle-ohasd.service」に「Before = WDOracle-shutdown.service」を追加することが最後のステップでした。工場。

WDOracle-db.service - サーバーとデータベースのバックアップが開始された後にOEMの中断を削除するサービス。また、OEM のライフサイクル状態を確認し、DB_ROLE がプライマリか物理的なスタンバイに応じて調整します。

これは関連する3つのサービスの私の設定です。

Cat /usr/lib/systemd/system/WDOracle-shutdown.service

[Unit]
Description=Oracle Blackout Creation
Before=shutdown.target reboot.target halt.target
After=oracle-ohasd.service
Requires=network-online.target network.target multi-user.target oracle-ohasd.service
RequiresMountsFor=/opt/apps/oem /opt/apps/oracle /opt/apps/grid

[Service]
KillMode=none
ExecStart=/bin/true
ExecStop=/opt/apps/oracle/scripts/WDOracle-db.sh stop
RemainAfterExit=yes
Type=oneshot

[Install]
WantedBy=multi-user.target

Cat /etc/systemd/system/WDOracle-db.service

[Unit]
Description=WD Oracle Non-Prod DB service
After=network-online.target remote-fs.target autofs.service oracle-ohasd.service

[Service]
User=root
Type=forking
ExecStart=/opt/apps/oracle/scripts/WDOracle-db.sh start
TimeoutSec=0
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

猫/etc/systemd/system/oracle-ohasd.service

[Unit]
Description=Oracle High Availability Services
After=network-online.target remote-fs.target autofs.service
Before=WDOracle-shutdown.service
Wants=network-online.target remote-fs.target

[Service]
ExecStart=/etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
ExecStop=/etc/init.d/init.ohasd stop >/dev/null 2>&1 </dev/null
TimeoutStopSec=60min
Type=simple
Restart=always

KillMode=process
SendSIGKILL=yes

StartLimitBurst=0

[Install]
WantedBy=multi-user.target graphical.target

関連情報