내 애플리케이션은 종료하기 전에 뭔가를 해야 합니다. 이미 signal을 처리하여 ctrl-c 상황을 처리했지만 SIGINT
시스템이 다시 시작하려고 할 때의 상황도 처리하고 싶습니다.
조사한 결과 SIGTERM
시스템이 재부팅될 때까지 전송하지 않는 것은 관리 작업을 통해 이루어진 것으로 나타났습니다 SIGTERM
. 이것이 맞습니까?
제가 처리할 수 있는 다른 신호가 있나요?
편집: 내 애플리케이션이 에 의해 실행되면 systemd
더 복잡해지거나 처리하기 쉬워지나요?
답변1
전송된 신호는 사용자 정의 가능하며 다음과 같이 기록됩니다.man systemd.kill
. 가장 흥미로운 부분은 다음과 같습니다.
KillSignal=
Specifies which signal to use when stopping a service. This
controls the signal that is sent as first step of shutting down a
unit (see above), and is usually followed by SIGKILL (see above
and below). For a list of valid signals, see signal(7). Defaults
to SIGTERM.
Note that, right after sending the signal specified in this
setting, systemd will always send SIGCONT, to ensure that even
suspended tasks can be terminated cleanly.
FinalKillSignal=
Specifies which signal to send to remaining processes after a
timeout if SendSIGKILL= is enabled. The signal configured here
should be one that is not typically caught and processed by
services (SIGTERM is not suitable). Developers can find it useful
to use this to generate a coredump to troubleshoot why a service
did not terminate upon receiving the initial SIGTERM signal. This
can be achieved by configuring LimitCORE= and setting
FinalKillSignal= to either SIGQUIT or SIGABRT. Defaults to
SIGKILL.
따라서 systemctl stop *.service
systemd는 SIGTERM
기본적으로 서비스의 기본 프로세스로 하나를 보냅니다. 프로세스가 TimeoutStopSec
(기본적으로 90초) 내에 종료 되지 않으면 systemd
따릅니다 SIGKILL
.
애플리케이션을 개발할 때 init 시스템에 대해 너무 많이 생각할 필요가 없습니다. 쌍에 대한 응답을 작성하고 싶지 않고 SIGTERM
그냥 유지하고 싶다면 SIGINT
그렇게 할 수 있습니다. 제공하는 시스템 서비스 파일에 이 파일이 포함되어 있는지 확인하기만 하면 됩니다 KillSignal=SIGINT
.
재부팅 시 systemd
건너뛰기를 권장하는 내용은 읽지 않았습니다. KillSignal=
닫힐 때 "대기 중..."이 표시되면 systemd
응답을 기다리고 있다는 의미입니다 KillSignal
.
답변2
내가 아는 한, 모든 init 시스템은 거의 동일한 동작을 구현합니다. 즉, SIGTERM을 보내고 잠시 기다렸다가 프로세스가 정상적으로 종료되지 않으면 SIGKILL을 보냅니다. 나는 systemd가 같은 방식으로 작동한다고 믿습니다. 내가 틀렸을 수도있다. 확실히 알 수 있는 가장 좋은 방법은 테스트해 보는 것입니다.
다양한 신호에 대한 설명과 그 의미를 읽고 그에 따라 애플리케이션이 반응하도록 하는 것이 좋습니다.
애플리케이션이 영구 프로세스로 실행되어야 하는 경우 이를 위한 시스템 단위 생성을 고려해야 합니다. 이렇게 하면 시스템이 종료될 때 systemd가 수행해야 하는 작업을 정확하게 제어할 수 있습니다.