Linux

用於 sysv init 到 systemd 轉換的自定義腳本

  • June 8, 2017

我有一個腳本,用於執行我們的 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

我在似乎可以工作的 CentOS 7 VM 上模擬了一些東西。我的自定義腳本僅在啟動、停止、重新啟動和狀態 (/var/tmp/custom.out) 時回顯到文件。一些細微的差別。在裡面 ”

$$ Unit $$“ 節你有“After=network.service”,我有“After=network-online.target”和“After=remote-fs.target”。我還添加了“Wants=network-online.target”。另一個區別是我在“$$ Service $$" 節,因為我假設腳本不是要在後台執行的 dameon。

# 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

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

引用自:https://unix.stackexchange.com/questions/368591