使用 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"
停止時: “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-auth
為session include custom-su-session