用於 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

但是,我想知道您的問題是否也可能是系統關閉時腳本尚未完成?

相關內容