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

这是stopsap脚本:

#!/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 的 oracle-ohasd.service 似乎永远不会干净地关闭数据库。但无论 oracle db 是否完全关闭,我希望我的脚本在执行 oracle-ohasd.service 之前执行此节点的 DG 切换和 OEM Blackout。这就是我所做的。

我声明了两项服务。

WDOracle-shutdown.service - 这负责执行我的预关闭脚本。我让它工作的关键是将“Before=WDOracle-shutdown.service”添加到oracle提供的“oracle-ohsasd.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 是 Primary 还是 Physical Standby 进行调整。

这是我对所涉及的 3 个服务的设置。

cat /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

cat /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

相关内容