Não é possível parar o SAP Hana adequadamente na reinicialização / desligamento com o systemd

3

Encontramos o seguinte problema em nossa empresa. Temos vários servidores Red Hat Enterprise Linux nos quais o "SAP HANA S / 4" está em execução. Criamos um serviço systemd para iniciar e parar automaticamente o daemon, para que não precisemos interagir manualmente com o sistema em uma reinicialização ou desligamento.

Autostart funciona bem, mas parece haver um problema em parar o daemon corretamente no desligamento. Os daemons estão sendo executados com outro usuário (individual para cada servidor). Parece que o systemd começa a matar as sessões do usuário antes que o serviço real seja parado; Como resultado, o serviço não será interrompido adequadamente.

Serviço

[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

O script que é chamado em ExecStart e ExecStop basicamente executa o seguinte comando.

No início:

"sudo -u $username csh -c "sapcontrol -nr $instance -function Start"

Na parada:     "sudo-u $ username csh -c" sapcontrol -nr $ instance -function Parar "

Log de desligamento

A saída do log do Systemd mostra o seguinte:

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()

Eu realmente apreciaria alguma ajuda se alguém aqui já tivesse encontrado o mesmo problema que nós. Espero que seja informação suficiente. Pode fornecer mais, se necessário.

Atualizar

Eu vejo os seguintes processos em execução quando o sistema está funcionando normalmente:

[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' 

Chnaged meu script para registrar a saída "ps -ef | grep sapstartsrv" quando o sistema for reinicializado / desligado.

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

O serviço sapstartsrv é iniciado por um serviço SAP padrão (sapinit) que obtém o startet antes do meu próprio Serviço Systemd (Então, em uma reinicialização, é a ordem inversa [Parar meu serviço Systemd - > interromper o serviço Sapinit]) parece ser que systemctl começa a matar a sessão do usuário (no meu caso para o usuário: d21adm e d61adm) onde o processo sapstartsrv está em execução antes que meu serviço Systemd real seja interrompido. (Espero que faça pelo menos um pouco de sentido)

Aqui está uma imagem de toda a cadeia de sistemas (meus serviços estão no final): Os serviços envolvidos: - sapinit.service (o padrão) - saphana.service (meu costume)

    
por Reykime 22.06.2018 / 10:04

1 resposta

1

Descobri a causa do meu problema, conforme descrito no seguinte KB link

O Systemd mata todos os usuários.slice após 90 segundos (Esse tempo limite não pode ser alterado) Parece que o systemd não é feito para parar automaticamente as instâncias do SAP HANA sem modificar o pam.d. A solução descrita parece ser um pouco "hackish", mas funciona.

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

Insira a seguinte linha antes de "session optional pam_systemd.so"

session [success=1 new_authtok_reqd=ok default=ignore] pam_listfile.so item=user sense=allow file=/etc/custom-su-session

Esta linha pula a criação user.slice quando o comando su é executado e o usuário é listado no arquivo / etc / custom-su-session

vim /etc/pam.d/su

Substitua session include system-auth com session include custom-su-session

    
por 09.07.2018 / 16:07