
OS 종료를 파악하고 OS를 종료하기 전에 몇 가지 작업을 수행해야 합니다. 저는 Fedora 19와 C++를 사용하고 있습니다.
다음 C++ 코드를 사용하여 콘솔에서 종료 신호를 캡처할 수 있습니다.
myAct.sa_handler = myStructure::mySignalHandler;
sigaction(mySignal, &act, NULL);
이 신호는 를 닫기 전에 사용자 정의 코드를 실행하여 활성화할 수 있습니다 mySignal
./etc/init.d
Fedora 12 Kernel 2.6에서 이 솔루션은 완벽하게 작동합니다. 이 솔루션은 그래픽 인터페이스를 사용하여 컴퓨터를 종료하려고 하면 Fedora 19 Kernel 3.9.5에서 작동합니다.
그러나 터미널의 명령을 사용하여 Fedora 19 커널 3.9.5에서 컴퓨터를 다시 시작하거나 종료할 때 코드를 실행할 수 없습니다. 이 솔루션은 일반적으로 사용되는 스크립팅 시스템을 제거하므로 더 이상 작동하지 않습니다 init.d
.
해당 위치에 스크립트를 넣으면 /usr/lib/systemsd
작동하지 않고 스크립트가 실행되지만 다른 스크립트도 실행됩니다. 그래서 내 명령을 처리하지 않고 시스템이 종료됩니다.
이 문제를 어떻게 해결할 수 있나요?
답변1
이 신호는 다음에서 얻을 수 있습니다.작업 과정. 따라서 부팅 시 수명이 긴 프로세스(데몬이라고도 함)를 시작하면 실제로 해당 프로세스에서 SIGTERM을 받고 신호 처리기에서 원하는 모든 작업을 수행하게 됩니다. 그러나 이것은 최악의 접근 방식입니다. 추가 프로세스는 신호가 도착할 때까지 기다리는 것 외에는 아무것도 하지 않습니다.
특히 이를 달성하는 더 좋은 방법이 있습니다. 체계적으로. 단위 파일( foo.service
)은 다음과 같습니다.
[Unit]
Description=Perform my actions
DefaultDependencies=no
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=/path/to/your/application
그러나 systemd의 병렬 특성으로 인해 종료 프로세스 후반에 장치가 임의로 시작될 수 있다는 점을 명심하십시오(종속성을 주의 깊게 사용하면 영향을 받을 수 있음).