web-dev-qa-db-ja.com

systemdでのリブート/シャットダウン時にSAP Hanaを適切に停止できない

弊社で以下の問題が発生しました。 「SAP HANA S/4」が実行されている複数のRed Hat Enterprise Linuxサーバーがあります。デーモンを自動的に開始および停止するsystemdサービスを作成したため、再起動またはシャットダウン時にシステムと手動で対話する必要はありません。

自動起動はうまく機能しますが、シャットダウン時にデーモンを正しく停止することに問題があるようです。デーモンは別のユーザーで実行されています(サーバーごとに個別)。実際のサービスが停止する前に、systemdがユーザーセッションを強制終了するようです。その結果、サービスは適切に停止しません。

サービス

[Unit]
Description=saphana
After=remote-fs.target user.slice sapinit.service multi-user.target
Requires=user.slice

[Service]
KillMode=none
Type=oneshot
ExecStart=/hana/source/scripts/sapHanaControl.pl start
ExecStop=/hana/source/scripts/sapHanaControl.pl stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

ExecStartでスクリプトが呼び出され、ExecStopは基本的に次のコマンドを実行します。

開始時:

"Sudo -u $username csh -c "sapcontrol -nr $instance -function Start"

On Stop: "Sudo -u $ username csh -c" sapcontrol -nr $ instance -function Stop "

シャットダウンログ

Systemdログの出力は以下を示します:

Jun 20 16:23:05 Host123 systemd[1]: Stopping Session c4 of user **userxy**.
Jun 20 16:23:05 Host123sapHanaControl.pl[15003]: Sudo -u **userxy** csh -c "sapcontrol -nr 00 -function Stop"
Jun 20 16:23:05 Host123 sapHanaControl.pl[15003]: 20.06.2018 16:23:05
Jun 20 16:23:05 Host123 sapHanaControl.pl[15003]: Stop
Jun 20 16:23:05 Host123 sapHanaControl.pl[15003]: FAIL: NIECONN_REFUSED (Connection refused), NiRawConnect failed in plugin_fopen()

更新

システムが正常に動作しているときに、次のプロセスが実行されているのがわかります。

[root@wsstadt325 ~]# ps -ef | grep sapstartsrv
d61adm    1740     1  0 11:56 ?        00:00:01 /usr/sap/D61/HDB05/exe/sapstartsrv pf=/usr/sap/D61/SYS/profile/D61_HDB05_wsstadt325 -D -u d61adm
sapadm    1741     1  0 11:56 ?        00:00:04 /usr/sap/hostctrl/exe/sapstartsrv pf=/usr/sap/hostctrl/exe/Host_profile -D
d21adm    1946     1  0 11:56 ?        00:00:02 /usr/sap/D21/ASCS01/exe/sapstartsrv pf=/usr/sap/D21/SYS/profile/D21_ASCS01_wsstadt325 -D -u d21adm
d21adm    2182     1  0 11:56 ?        00:00:02 /usr/sap/D21/D00/exe/sapstartsrv pf=/usr/sap/D21/SYS/profile/D21_D00_wsstadt325 -D -u d21adm` 

システムが再起動/電源オフされたときに「ps -ef | grep sapstartsrv」出力をログに記録するようにスクリプトを変更しました。

ps -ef | grep sapstartsrv
sapadm    1683     1  0 13:52 ?        00:00:01 /usr/sap/hostctrl/exe/sapstartsrv pf=/usr/sap/hostctrl/exe/Host_profile -D
root      5706  5522  0 14:00 ?        00:00:00 sh -c ps -ef | grep sapstartsrv
root      5708  5706  0 14:00 ?        00:00:00 grep sapstartsrv

Sapstartsrvサービスは、デフォルトのSAPサービス(sapinit)によって開始され、自分のSystemdサービスの前に開始されます(したがって、再起動すると逆の順序になります[Systemdサービスを停止-> Sapinitサービスを停止])問題はsystemctlは、ユーザーセッション(ユーザーの場合:d21admおよびd61adm)を強制終了し、実際のSystemdサービスが停止する前にsapstartsrvプロセスが実行されます。 (少なくとも少し理にかなっていると思います)

Systemdチェーン全体の画像を次に示します(私のサービスは最後にあります)。関連するサービス:-sapinit.service(デフォルトのサービス)-saphana.service(私のカスタムサービス)

Image Systemd Chain

3
Reykime

次のKBで説明されているように、私の問題の原因を突き止めました https://www.suse.com/de-de/support/kb/doc/?id=7022671

Systemdはすべてのuser.sliceを90秒後に強制終了します(このタイムアウトは変更できません)pam.dを変更せずにSAP HANAインスタンスを自動的に停止するようにsystemdが作成されていないようです。そこに記載されているソリューションは少し「ハック」のようですが、機能します。

cp /etc/pam.d/system-auth /etc/pam.d/custom-su-session
vim /etc/pam.d/custom-su-session

「session optional pam_systemd.so」の前に次の行を挿入します

session [success=1 new_authtok_reqd=ok default=ignore] pam_listfile.so item=user sense=allow file=/etc/custom-su-session

この行は、suコマンドが実行され、ユーザーがファイル/ etc/custom-su-sessionにリストされている場合、user.sliceの作成をスキップします。

vim /etc/pam.d/su

置換session include system-authsession include custom-su-session

1
Reykime