따라서 Unix/Linux 종료 프로세스(매우 제한적임을 인정함)에 대한 나의 이해를 바탕으로 어느 시점에서 다음 단계가 발생한다고 생각합니다. 1. 마운트된 드라이브가 마운트 해제됩니다. 2. 실행 중인 드라이브에 종료 신호가 전송됩니다. 이를 통해 해당 애플리케이션을 종료하기 전에 정리할 수 있습니다.
이제 어느 것이 먼저 발생합니까? 아니면 #1이 전혀 일어나지 않았나요? 아니면 주문이 보장되지 않나요?
제가 이 질문을 하는 이유는 종료 시 중앙 구성 파일을 어디에나 배치할 수 있는 중앙 구성 파일에 데이터를 쓰는 애플리케이션을 개발 중이기 때문입니다. 제가 우려하는 점은 중앙 구성 파일이 마운트된 드라이브에 있고 #1이 #2보다 먼저 발생하면 중앙 구성 파일에 대해 저장한 경로가 더 이상 유효하지 않을 수 있다는 것입니다. 이러한 우려는 정당한가?
답변1
이는 초기화 시스템과 구성 방법에 따라 다릅니다. 그러나 합리적인 구성을 통해 시스템 소프트웨어는 종료 시 실행할 후크를 등록할 수 있습니다. 기존 System V init의 경우 이는 이벤트입니다 /etc/rc0.d
. 기존 BSD init의 경우 이는 이벤트입니다 /etc/rc.shutdown
. Upstart의 경우 0 또는 6으로의 실행 수준 변경 이벤트입니다. 목록은 계속 이어지기 때문에 모든 배포판에 대한 패키지를 유지 관리하는 것은 많은 작업이 될 수 있습니다(대부분의 작성자는 응용 프로그램에 대한 종료 스크립트를 제공하고 배포판 유지 관리 담당자가 올바른 위치에 등록된 패키지를 만들고 스크립트를 닫도록 합니다).
모든 응용 프로그램 관련 스크립트가 실행되면 종료의 마지막 단계가 발생합니다. 일반적으로 여기에는 열려 있는 파일이 아직 존재하는 파일 시스템을 제외한 모든 파일 시스템을 마운트 해제한 다음 나머지 모든 프로세스를 종료하고 마지막으로 나머지 파일 시스템(읽기 전용으로 다시 마운트한 루트 제외)을 마운트 해제하고 컴퓨터를 중지하거나 다시 시작하는 작업이 포함됩니다. 일반적으로 포착 가능한 TERM 신호가 모든 프로세스에 전송되고 몇 초 후에 KILL 신호가 전송됩니다. 프로세스가 반응을 시도할 수 있지만 시간은 제한되어 있으며 시스템은 기다리지 않습니다.
따라서 애플리케이션이 루트로 설치된 경우 종료 시간 초기화 스크립트만 등록하면 됩니다. 권한이 없는 사용자가 애플리케이션을 설치한 경우 종료 단계 동안 작업을 수행할 수 있다는 보장이 없습니다.
무슨 일이 있어도 시스템 충돌이나 정전을 적절하게 처리해야 합니다. 종료 중 작업은 다음 시작을 더욱 효율적으로 만드는 작업으로 제한되어야 하며, 반드시 수행해야 하는 작업은 없어야 합니다.