/etc/init.d 서비스를 systemd로 변환

/etc/init.d 서비스를 systemd로 변환

기존 /etc/init.d 서비스를 systemd로 변환하는 중입니다. 작동하는 것 같았지만 이상한 문제가 발생했습니다. systemd 서비스는 "systemctl start service_name" 명령으로 시작하고 "systemctl stop service_name"으로 중지하지만 완전히 중지되지는 않는 것 같습니다. 기본 애플리케이션은 이미 실행 중인지 확인하고 이 경우 즉시 종료됩니다. 이것이 지금 일어나고 있는 일입니다.

다음은 이전 /etc/init.d 스크립트와 동일한 코드 조각입니다.

kill_process() {
    pkill -SIGINT service_name
    sleep 1
    if [ -n "$(pgrep service_name)" ]; then
        pkill -SIGTERM service_name
        sleep 1
    fi 
    if [ -n "$(pgrep service_name)" ]; then
        pkill -SIGKILL service_name
        sleep 1
    fi 
    if [ -z "$(pgrep service_name)" ]; then
        rm -f /var/lock/subsys/service_name
    fi
}

start() {
    action $"Starting Service: " /sbin/service_name
}

stop() {
    action $"Stopping Service: " kill_process
}

restart() {
    stop
    start
}

그리고 이것은 systemd 동등성에 대한 나의 초기 시도입니다.

[Unit]
Description=Service Name

[Service]
ExecStart=/sbin/service_name

[Install]
WantedBy=multi-user.target

제가 이해한 바는 systemd 서비스가 SIGTERM을 사용하여 프로세스 종료를 처리하지만 KillSignal 및 ExecStop에 대해 다른 값을 실험해 본 것입니다. 그러나 나는 종료 동작의 이러한 차이점을 아직 이해하지 못했습니다. 또한 SIGINT를 사용하여 애플리케이션을 수동으로 종료해도 서비스가 완전히 종료되지는 않습니다. /etc/init.d가 뒤에서 다른 작업을 수행하는지 궁금합니다.

어떤 제안이라도 감사하겠습니다.

답변1

다른 사람이 관심을 가질 경우를 대비하여 이 게시물 아래에 선을 긋고 싶었습니다.

getppid()가 아직 1이 아닌 경우(즉, 아직 분기되지 않은 경우) 서비스의 일부로 실행되는 C 응용 프로그램은 이전에 fork()를 사용했습니다. 응용 프로그램이 systemd에 의해 실행될 때 이미 상위 PID가 1인 것 같습니다. 우리 응용 프로그램은 이전에 명시적인 SIGTERM 처리가 없었지만 /etc/init.d의 컨텍스트에서 SIGINT에 반응할 때 정상적으로 종료되었습니다. 특정 SIGTERM 처리기를 추가했는데 이제 서비스가 예상대로 작동합니다.

관련 정보