пользовательский скрипт для преобразования 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, который, кажется, работает. Мойcustomscriptпросто выводит эхо в файл при запуске, остановке, перезапуске и статусе (/var/tmp/custom.out). Несколько незначительных отличий. В строфе "[Unit]" у вас есть "After=network.service", у меня есть "After=network-online.target" и "After=remote-fs.target". Я также добавил "Wants=network-online.target". Другое отличие в том, что я изменил "Type=forking" на "Type=simple" в строфе "[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

Однако мне интересно, может ли проблема заключаться в том, что скрипт не завершается к моменту выключения системы?

Связанный контент