RHEL 7 systemd를 종료/다시 시작하기 전에 긴 스크립트를 실행하는 방법

RHEL 7 systemd를 종료/다시 시작하기 전에 긴 스크립트를 실행하는 방법

RedHat7에서 종료/다시 시작을 시작하기 전에 스크립트를 실행하는 방법에 대한 해결책을 찾으려고 합니다. 서버를 종료하거나 다시 시작할 때 SAP 데이터베이스를 올바르게 종료해야 합니다.

SAP 종료 스크립트는 3~4분 정도 걸리지만 시스템은 매우 빠르게 종료됩니다. 즉, RedHat이 모든 프로세스를 즉시 종료합니다.

내 거

systemd sap.service는 다음과 같습니다.

[Unit]
Description=Shutdown SAP
Before=shutdown.target reboot.target halt.target

[Service]
ExecStart=/bin/true
ExecStop=/usr/sap/stopsap
RemainAfterExit=true
KillMode=none

[Install]
WantedBy=multi-user.target

종료 로그에서 볼 수 있듯이 데이터베이스가 제대로 종료되지 않았습니다.

Checking ADA Database
-------------------------------------------
setTrace: false
J2EE Database is not available

도와주세요?

감사해요

이보

2015년 10월 21일에 수정됨:

다음 단계로 넘어갑니다. 더 잘 작동하지만 여전히 올바르지 않습니다.

[Unit] Description=SAP sluzba After=network.target sshd.target Wants=network.target sshd.service [Service] Type=simple RemainAfterExit=true Environment="SAPSYSTEMNAME=RH7" "HOST=cz-brn1-rh7" "HOME=/home/rh7adm" "PATH=/sapdb/clients/RH7/bin:/sapdb/programs/bin:/usr/lib64/qt-.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/usr/sap/RH7/SYS/exe/run:/home/rh7adm:." "DIR_LIBRARY=/usr/sap/RH7/SYS/exe/run" "LD_LIBRARY_PATH=/usr/sap/RH7/SYS/exe/run:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/sapdb/clients/RH7/lib" "RSEC_SSFS_DATAPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/data" "RSEC_SSFS_KEYPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/key" KillMode=none SendSIGKILL=no TimeoutSec=5min TimeoutStopSec=5min User=rh7adm Group=sapsys ExecStart=/usr/sap/startsap ExecStop=/usr/sap/stopsap
[Install] WantedBy=graphical.target

stopap 스크립트는 다음과 같습니다.

#!/bin/bash date >> /usr/sap/stopsap.log; /usr/sap/RH7/SYS/exe/uc/linuxx86_64/stopsap >> /usr/sap/stopsap.log 2>&1; whoami >> /usr/sap/stopsap.log;

J2EE Database is running See logfile /home/rh7adm/JdbcCon.log stopping the SAP instance J28 Shutdown-Log is written to /home/rh7adm/stopsap_J28.log /usr/sap/RH7/J28/exe/sapcontrol -prot NI_HTTP -nr 28 -function Stop Instance on host cz-brn1-rh7 stopped Waiting for cleanup of resources..................................................................................................................................................

여기서는 5분 동안 멈춥니다. 종료 스크립트가 완료되지 않습니다. :(

수액이 어떻게 닫히는지 추적할 수 있나요? 제공하다?

감사해요..

답변1

TimeoutStopSec유닛 파일의 값을 변경해 보세요 . 기본값은 항목 /etc/systemd/system.conf에 설정되어 있습니다 DefaultTimeoutStopSec(내 시스템에서는 90초로 설정되어 있습니다). 종료를 완전히 비활성화하는 시간 초과를 설정하거나 TimeoutStopSec=0(스크립트가 종료되지 않으면 종료가 중단될 수 있음) 스크립트가 완전히 완료되지 않도록 더 큰 값을 전달할 수 있습니다.

답변2

좋은 질문은 환경에 있습니다.

sap.service의 올바른 정의는 다음과 같습니다.

[Unit] Description=SAP sluzba After=network.target sshd.target Wants=network.target sshd.service [Service] Type=simple RemainAfterExit=true Environment="HOSTNAME=cz-brn1-rh7" "SAPSYSTEMNAME=RH7" "HOST=cz-brn1-rh7" HOME=/home/rh7adm" PATH=/sapdb/clients/RH7/bin:/sapdb/programs/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/usr/sap/RH7/SYS/exe/run:/home/rh7adm:." "DIR_LIBRARY=/usr/sap/RH7/SYS/exe/run" "LD_LIBRARY_PATH=/usr/sap/RH7/SYS/exe/run:/usr/sap/RH7/SYS/exe/uc/linuxx86_64:/sapdb/clients/RH7/lib" "RSEC_SSFS_DATAPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/data" "RSEC_SSFS_KEYPATH=/usr/sap/RH7/SYS/global/security/rsecssfs/key" KillMode=none SendSIGKILL=no TimeoutSec=5min TimeoutStopSec=5min User=rh7adm Group=sapsys ExecStart=/usr/sap/startsap ExecStop=/usr/sap/stopsap [Install] WantedBy=graphical.target

답변3

Oracle DB가 종료되기 전에 스크립트를 실행해야 하는 비슷한 필요성이 있었고 다른 사람이 이 게시물을 보고 해결책을 찾는 경우를 대비하여 여기에서 결과를 공유해야 한다고 생각했습니다.

나에게 있어 오라클의 oracle-ohasd.service는 데이터베이스를 완전히 종료하지 않는 것 같습니다. 그러나 oracle db가 완전히 종료되었는지 여부에 관계없이 oracle-ohasd.service를 실행하기 전에 스크립트에서 이 노드의 DG 전환 및 OEM 블랙아웃을 수행하고 싶습니다. 이것이 제가하는 것입니다.

두 가지 서비스를 선언했습니다.

WDOracle-shutdown.service - 사전 종료 스크립트 실행을 담당합니다. 작동하게 하는 핵심은 oracle에서 제공한 "oracle-ohsasd.service"에 "Before=WDOracle-shutdown.service"를 추가하고 내 WDOracle-shutdown.service에 "After=oracle-ohsasd.service"를 추가하는 것이었습니다. . WDOracle-shutdown.service에 "Before, Requires 및 RequiresMountsFor"가 필요할 수도 있지만 oracle에서 제공한 "oracle-ohasd.service"에 "Before=WDOracle-shutdown.service"를 추가하는 것이 마지막 단계였습니다. 공장.

WDOracle-db.service - 서버 및 데이터베이스 백업이 시작된 후 OEM 중단을 제거하는 서비스입니다. 또한 OEM의 수명주기 상태를 확인하고 DB_ROLE이 기본인지 물리적 대기인지에 따라 조정합니다.

이것은 관련된 3가지 서비스에 대한 나의 설정입니다.

고양이 /usr/lib/systemd/system/WDOracle-shutdown.service

[Unit]
Description=Oracle Blackout Creation
Before=shutdown.target reboot.target halt.target
After=oracle-ohasd.service
Requires=network-online.target network.target multi-user.target oracle-ohasd.service
RequiresMountsFor=/opt/apps/oem /opt/apps/oracle /opt/apps/grid

[Service]
KillMode=none
ExecStart=/bin/true
ExecStop=/opt/apps/oracle/scripts/WDOracle-db.sh stop
RemainAfterExit=yes
Type=oneshot

[Install]
WantedBy=multi-user.target

고양이 /etc/systemd/system/WDOracle-db.service

[Unit]
Description=WD Oracle Non-Prod DB service
After=network-online.target remote-fs.target autofs.service oracle-ohasd.service

[Service]
User=root
Type=forking
ExecStart=/opt/apps/oracle/scripts/WDOracle-db.sh start
TimeoutSec=0
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

고양이/etc/systemd/system/oracle-ohasd.service

[Unit]
Description=Oracle High Availability Services
After=network-online.target remote-fs.target autofs.service
Before=WDOracle-shutdown.service
Wants=network-online.target remote-fs.target

[Service]
ExecStart=/etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
ExecStop=/etc/init.d/init.ohasd stop >/dev/null 2>&1 </dev/null
TimeoutStopSec=60min
Type=simple
Restart=always

KillMode=process
SendSIGKILL=yes

StartLimitBurst=0

[Install]
WantedBy=multi-user.target graphical.target

관련 정보