
기존 /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 처리기를 추가했는데 이제 서비스가 예상대로 작동합니다.