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 $usernamecsh -c"sapcontrol -nr $instance-function 중지"

종료 로그

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 서비스는 내 Systemd 서비스보다 먼저 시작되는 기본 SAP 서비스(sapinit)에 의해 시작됩니다(따라서 다시 시작하면 역순입니다[내 Systemd 서비스 중지 -> Sapinit 서비스 중지]). 문제는 systemctl이 종료되기 시작하는 것 같습니다. 실제 Systemd 서비스가 중지되기 전에 sapstartsrv 프로세스가 실행되고 있던 사용자 세션(내 경우에는 사용자: d21adm 및 d61adm). (이것이 적어도 약간의 의미가 있기를 바랍니다)

다음은 전체 시스템 체인의 이미지입니다(내 서비스는 끝에 있습니다). 관련 서비스: - 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 인스턴스를 자동으로 중지할 수 없는 것 같습니다. 여기에 설명된 솔루션은 약간 "해킹적인" 것처럼 보이지만 작동합니다.

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

"session option 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

관련 정보