시스템이 다시 시작하려고 할 때 프로세스는 어떤 신호(예: SIGINT 또는 SIGTERM)를 얻을 수 있습니까?

시스템이 다시 시작하려고 할 때 프로세스는 어떤 신호(예: SIGINT 또는 SIGTERM)를 얻을 수 있습니까?

내 애플리케이션은 종료하기 전에 뭔가를 해야 합니다. 이미 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 *.servicesystemd는 SIGTERM기본적으로 서비스의 기본 프로세스로 하나를 보냅니다. 프로세스가 TimeoutStopSec(기본적으로 90초) 내에 종료 되지 않으면 systemd따릅니다 SIGKILL.

애플리케이션을 개발할 때 init 시스템에 대해 너무 많이 생각할 필요가 없습니다. 쌍에 대한 응답을 작성하고 싶지 않고 SIGTERM그냥 유지하고 싶다면 SIGINT그렇게 할 수 있습니다. 제공하는 시스템 서비스 파일에 이 파일이 포함되어 있는지 확인하기만 하면 됩니다 KillSignal=SIGINT.

재부팅 시 systemd건너뛰기를 권장하는 내용은 읽지 않았습니다. KillSignal=닫힐 때 "대기 중..."이 표시되면 systemd응답을 기다리고 있다는 의미입니다 KillSignal.

답변2

내가 아는 한, 모든 init 시스템은 거의 동일한 동작을 구현합니다. 즉, SIGTERM을 보내고 잠시 기다렸다가 프로세스가 정상적으로 종료되지 않으면 SIGKILL을 보냅니다. 나는 systemd가 같은 방식으로 작동한다고 믿습니다. 내가 틀렸을 수도있다. 확실히 알 수 있는 가장 좋은 방법은 테스트해 보는 것입니다.

다양한 신호에 대한 설명과 그 의미를 읽고 그에 따라 애플리케이션이 반응하도록 하는 것이 좋습니다.

애플리케이션이 영구 프로세스로 실행되어야 하는 경우 이를 위한 시스템 단위 생성을 고려해야 합니다. 이렇게 하면 시스템이 종료될 때 systemd가 수행해야 하는 작업을 정확하게 제어할 수 있습니다.

관련 정보