У меня есть сценарий, который используется для выполнения предварительной и последующей проверки работоспособности наших серверов RedHat, и этот сценарий отлично работает на RHEL 6. Кроме того, я настроил сценарий в runlevel, чтобы он отправлял мне электронное письмо до и после перезагрузки. Теперь я хочу, чтобы то же самое было настроено на моих машинах 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, которая, похоже, работает. Мой пользовательский скрипт просто отображает файл при запуске, остановке, перезапуске и статусе (/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]», так как я предполагаю, что сценарий не является демоном, предназначенным для работы в фоновом режиме.
# 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
Однако мне интересно, может ли ваша проблема заключаться в том, что сценарий не завершился к моменту завершения работы системы?