我们公司遇到了以下问题。我们有多个运行“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