Linux

使用 systemd 重新啟動/關閉時無法正確停止 SAP Hana

  • April 16, 2019

我們在公司遇到了以下問題。我們有多個執行“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"

停止時: “sudo -u $ username csh -c “sapcontrol -nr $ 實例-功能停止”

關機日誌

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 服務之前啟動(因此在重新啟動時它是相反的順序

$$ Stop my Systemd Service -> stop the Sapinit Service $$) 問題似乎是 systemctl 在我的實際 Systemd 服務停止之前開始終止 sapstartsrv 程序正在執行的使用者會話(在我的情況下為使用者:d21adm 和 d61adm)。(希望這至少有點道理) 這是整個 systemd 鏈的圖像(我的服務在最後): 所涉及的服務: - sapinit.service(預設) - sapinit.service(我的自定義)

圖像系統鏈

找出我的問題的原因,如以下 KB https://www.suse.com/de-de/support/kb/doc/?id=7022671中所述

Systemd 在 90 秒後殺死每個 user.slice(此超時無法更改)看起來 systemd 只是不會在不修改 pam.d 的情況下自動停止 SAP HANA 實例。那裡描述的解決方案似乎有點“駭人聽聞”,但它確實有效。

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

在“會話可選 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

引用自:https://unix.stackexchange.com/questions/451245