sysv init에서 systemd로의 변환을 위한 사용자 정의 스크립트

sysv init에서 systemd로의 변환을 위한 사용자 정의 스크립트

RedHat 서버에서 사전 및 사후 상태 확인을 수행하는 스크립트가 있으며 RHEL 6에서 제대로 작동합니다. 또한 재부팅 전후에 이메일을 보내도록 실행 수준에서 스크립트를 구성했습니다. 이제 RHEL 7 시스템에서도 동일하게 구성하고 싶지만 systemd에서 스크립트를 구성할 때 문제는 재부팅 전 상태가 아닌 재부팅 후 보고만 수행한다는 것입니다. 또한 rhel 7 시스템에서 스크립트를 수동으로 실행하면 제대로 작동합니다. 따라서 내 스크립트에는 아무런 문제가 없다고 생각합니다. 사용자 정의 스크립트를 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

그러나 시스템이 종료될 때 스크립트가 아직 완료되지 않은 것이 문제일 수도 있는지 궁금합니다.

관련 정보