使用 systemd 重新启动/关闭时无法正确停止 SAP Hana

使用 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 $用户名csh -c”sapcontrol -nr $实例-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),其中 sapstartsrv 进程在我的实际 Systemd 服务停止之前正在运行。 (希望这至少有一点道理)

这是整个 systemd 链的图像(我的服务位于最后): 涉及的服务: - sapinit.service(默认服务) - saphana.service(我的自定义服务)

图像系统链

答案1

找出问题的原因,如以下知识库所述 https://www.suse.com/de-de/support/kb/doc/?id=7022671

Systemd 在 90 秒后杀死每个 user.slice (此超时无法更改)看起来 systemd 无法在不修改 pam.d 的情况下自动停止 SAP HANA 实例。那里描述的解决方案似乎有点“hackish”,但它有效。

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

相关内容