유예 기간 이후 SIGKILL

유예 기간 이후 SIGKILL

저는 많은 프로세스 관리자가 이 작업을 수행하는 것을 보았습니다. 내가 이해한 바에 따르면 프로세스를 종료하려면 SIGTERM만 사용해야 합니다. 프로세스 자체를 정리하는 데 알 수 없는 시간이 걸릴 수 있으며 느린 시스템에서는 몇 분이 걸릴 수 있습니다. 나는 항상 유일한 해결책은 프로그램이 정리되고 정상적으로 종료될 때까지 인내심을 갖고 기다리는 것이라고 생각했습니다. 프로세스가 SIGTERM을 포착하지 못하는 경우 이는 버그이므로 소프트웨어 관리자에게 보고해야 합니다.

나는 docker와 같은 인기 있는 도구도 이 작업을 수행하는 것을 보았습니다.

사용법: docker stop [옵션] CONTAINER [CONTAINER...]

실행 중인 컨테이너를 중지합니다(SIGTERM을 보낸 다음 유예 기간 후에 SIGKILL을 보냅니다).

이것이 나쁜 습관입니까? 제가 궁금한 점 중 하나는 SystemV 스타일 초기화 시스템에서 종료 프로세스가 어떻게 작동하는지입니다. 일부 매뉴얼 페이지와 기타 질문을 살펴봤지만 명확한 답변을 찾을 수 없습니다. 나는 각 초기화 서비스(용어?)가 런레벨 변경을 확인하고 초기화 스크립트에 정의된 올바른 "중지" 기능을 실행한다고 추측합니다. 이 작업을 하나씩 수행하여 각 서비스가 올바르게 종료되는지 확인합니까? init 스크립트에 의해 처리되지 않는 프로세스는 어떻게 되나요? SIGKILL 이전에 유예 기간을 사용하는 것에 대해 모호하게 언급하는 질문이 몇 가지 있었지만 누군가가 자세히 설명하거나 적어도 올바른 방향을 알려줄 수 있기를 바랍니다. :)

누구든지 제가 systemd의 작동 방식을 더 잘 이해할 수 있도록 도와주실 수 있다면 기꺼이 조사하고 자세히 알아볼 것입니다. 매뉴얼 페이지를 보았지만 명확한 정보를 찾을 수 없습니다.

답변1

케이크를 먹고 먹을 수도 있습니다. 프로그램은 SIGTERM에 반응할 충분한 시간을 갖기를 희망합니다. 시스템(프로그램 관리자)을 종료하려고 합니다. 시스템이 영원히 기다리면 프로그램이 응답하지 않음으로써(프로그램이 악의적이거나 버그가 있기 때문에) 시스템 종료를 하이재킹할 수 있습니다.

일반적인 종료 순서에서 각 데몬은 데몬 작성자나 패키지 작성자가 제공하는 init 스크립트(필요한 경우 종료 스크립트라고 함)에 의해 종료됩니다. 데몬에 따라 init 스크립트는 단순히 신호를 보낼 수도 있고 더 제어된 종료를 수행할 수도 있습니다(예: 소켓에 쓰기). init 스크립트는 데몬이 정상적으로 종료되었음을 보고할 때까지 기다리거나 강제로 종료할 수 있습니다. 초기화 스크립트는 루트로 실행됩니다( su일부 작업을 수행하기 위해 권한이 낮은 사용자로 호출될 수 있음). 따라서 시스템이 영원히 중단될 수 있습니다.

init 스크립트가 작업을 마치면 모든 서비스를 종료해야 합니다. 나머지 프로세스는 중요하지 않거나 오작동해야 합니다. 따라서 이 단계에서 나머지 프로세스는 종료하라는 지시를 받고(SIGTERM) 유예 기간(완전히 종료할 수 있는 마지막 기회 제공) 후에 나머지 프로세스를 강제로 종료하려면 시스템을 종료해야 합니다(SIGKILL). ).

초기화 스크립트를 일반적인 체포 절차(영장 제시, 경고 외침 등)로 생각하십시오. 법을 준수하는 데몬은 이 시점에서 종료되어야 하지만, 원할 경우 데몬에 변호사(초기화 스크립트)가 있습니다. 정상적인 프로세스가 완료되면 나머지 데몬 프로세스는 적대적인 것으로 간주됩니다. 시스템은 경고 신호(SIGTERM)를 발행한 후 지연 후 SIGKILL을 발행합니다.

관련 정보