用于 sysv init 到 systemd 转换的自定义脚本

用于 sysv init 到 systemd 转换的自定义脚本

我有一个脚本,用于对 RedHat 服务器执行前后健康检查,该脚本在 RHEL 6 上运行良好。此外,我已在运行级别配置该脚本,以便它在重新启动之前和之后向我发送电子邮件。现在我希望在我的 RHEL 7 计算机上配置相同的内容,但问题是当我在 systemd 中配置脚本时,它仅执行重新启动后报告,而不执行重新启动前状态。另外,当我在 rhel 7 机器上手动执行脚本时,它工作得很好。所以我相信我的脚本没有问题,在将自定义脚本设置为 systemd 时一定缺少一些配置。

这是我的示例 systemd 配置:

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/customscript
Description=SYSV: Server Reboot
Before=shutdown.target
After=network.service
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/customscript start
ExecStop=/etc/rc.d/init.d/customscript stop

[Install]
WantedBy=multi-user.target

答案1

我在 CentOS 7 虚拟机上模拟了一些看起来可以工作的东西。我的自定义脚本仅在启动、停止、重新启动和状态时回显到文件 (/var/tmp/custom.out)。一些细微的差别。在“[Unit]”节中,您有“After=network.service”,我有“After=network-online.target”和“After=remote-fs.target”。我还添加了“Wants=network-online.target”。另一个区别是我在“[Service]”节中将“Type=forking”更改为“Type=simple”,因为我假设该脚本不是要在后台运行的守护进程。

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/customscript
Description=LSB: Start daemon at boot time
Before=shutdown.target
After=remote-fs.target
After=network-online.target
After=postfix.service
Wants=network-online.target

[Service]
Type=oneshot
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/customscript start
ExecStop=/etc/rc.d/init.d/customscript stop

[Install]
WantedBy=multi-user.target

作为参考,我的 /etc/rc.d/init.d/customscript 文件是:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          customscript
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

# Using the lsb functions to perform the operations.
. /lib/lsb/init-functions

case $1 in
    start)
        echo "Custom Start at $(date)" >> /var/tmp/custom.out
        ;;
    stop)
        echo "Custom Stop at $(date)" >> /var/tmp/custom.out
        ;;
    restart)
        echo "Custom Restart at $(date)" >> /var/tmp/custom.out
        ;;
    status)
        echo "Custom Status at $(date)" >> /var/tmp/custom.out
        ;;
    *)
        echo "Custom other at $(date)" >> /var/tmp/custom.out
        ;;
esac

这是/var/tmp/custom.out。我在 13:04 关机,等了几分钟然后启动。又过了20分钟,再次关机,又等了2分钟多一点,然后再次启动。

Custom Stop at Thu Jun  1 13:04:37 PDT 2017
Custom Start at Thu Jun  1 13:10:39 PDT 2017
Custom Stop at Thu Jun  1 13:30:07 PDT 2017
Custom Start at Thu Jun  1 13:32:45 PDT 2017

但是,我想知道您的问题是否也可能是系统关闭时脚本尚未完成?

相关内容