비슷한 질문에 대한 답변이 여기에서 여러 번 나왔다는 것을 알고 있으며 제 질문이 이상해 보일 수도 있지만 제 상황은 다릅니다. Linux 종료 명령을 캡처하고 싶습니다.앞으로또 다른 프로세스는 UI에 메시지를 표시하고 종료를 연기/취소합니다.
상황은 이렇습니다.
우리는 업무에 가상 머신(Amazon Workspaces)을 사용합니다. 우리는 이 머신에 대한 루트 액세스 권한을 가지고 있습니다 another people
(예: 보안 담당자). 그들은 another people
우리를 존중하지 않으며 우리가 컴퓨터에서 작업할 때 종종 Linux 작업 공간을 다시 시작합니다. 우리는 UI(예: Intellij IDE)가 있는 애플리케이션을 사용하고 때로는 터미널에서 작업합니다. 안타깝게도 여기에는 재부팅이 임박했음을 경고하는 알림이 없습니다. another people
지연 여부에 관계없이 가상 작업 공간을 다시 시작하는 방법을 모르겠습니다 .
내가 원하는 것:
- 종료 신호를 캡처하는 스크립트를 백그라운드에서 실행합니다.
- 종료 신호 캡처앞으로어떤 응용 프로그램에서도 작동합니다!
- UI 경고를 표시합니다(터미널 메시지 아님).
- 그러면 종료가 방지되고 나중에 머신을 수동으로 다시 시작할 수 있습니다.
나는 bash 스크립트에서 신호를 포착 trap
하고 취소 할 수 있다는 것을 알고 있지만 shutdown -c
때로는 너무 늦어 스크립트가 작업을 수행하기 전에 신호가 실행 중인 다른 사용자 프로세스를 종료합니다.
문제는 다른 프로세스가 종료 신호를 포착하고 시간에 맞춰 종료를 취소하기 전에 어떻게든 종료 신호를 포착하고 취소할 수 있느냐는 것입니다.
어쩌면 이 상황을 처리할 수 있는 기존 도구가 있을 수도 있지만 확실하지는 않습니다.
another people
믿거나 말거나, 우리는 여러 번 대화를 시도했습니다. 또 다른 문제는 업무 시간 외에 종료가 발생하면 원격 데스크톱만 닫고 다음날 아침에 다시 돌아올 것이기 때문에 작업을 저장하지 않기 때문에 종료도 연기해야 한다는 것입니다.
다른 시간대에서 일하는 경우 근무 시간을 정의하는 방법은 또 다른 문제입니다.
주요 문제는 종료 신호를 캡처하는 방법입니다.앞으로모든 응용 프로그램에 도달하여 취소합니다.
답변1
[C] 다른 프로세스가 종료 신호를 포착하기 전에 어떻게든 종료 신호를 포착하여 취소하고 제때에 종료를 취소할 수 있습니까?
그것은 불가능합니다. 시스템을 종료하려는 경우 커널에 시스템을 즉시 종료하고 모든 사용자 공간 메커니즘( reboot
예: 시스템 호출 사용)을 우회하도록 지시할 수 있으며 이를 방지할 수 있는 방법은 없습니다.
귀하와 같은 가상 환경에서는 상황이 더욱 무섭습니다. 아무런 알림도 받지 못한 채 단순히 컨테이너를 해체하거나 VM을 종료할 수 있기 때문입니다.
Bash 스크립트에서 트랩을 사용하여 신호를 잡을 수 있다는 것을 알고 있습니다.
이러한 신호를 포착하면 어떤 일이 발생합니까? 당신은 틀렸습니다. 정상적으로 종료되면 init 시스템은 SIGTERM
결국 SIGKILL
실행 중인 프로세스에 을 보냅니다. 이는 단순히 시스템이 즉시 종료되고 응용 프로그램이 작업을 저장해야 함을 시스템에 나타냅니다. 중요한 것은 이것은 협상이 아니라 작업을 절약하는 지침입니다. 를 트랩하더라도 SIGTERM
종료가 중단되거나 지연되지 않습니다.
방해 요소를 줄이기 위한 몇 가지 아이디어:
- IDE에 정기적으로 작업 내용을 자동으로 저장합니다. 이렇게 하면 예기치 않은 종료 문제가 해결되지는 않지만 데이터 손실은 최소화됩니다.
rsync
로컬 머신에서 작업하고 VCS를 통해 또는 VCS를 사용하여 작업을 가상 머신과 동기화하는 것을 고려해보세요. 이렇게 하면 가상 머신이 종료되더라도 작업에 계속 액세스할 수 있습니다.
이러한 기술 솔루션 중 일부는 문제를 부분적으로 완화할 수 있지만 기계에 액세스하는 여러 당사자 간의 의사소통이나 존중이 부족하다는 핵심 문제를 해결하지 못합니다. 한 가지 방법으로 컴퓨터를 종료하지 못하게 하면 의심할 여지없이 다른 방법으로 시스템을 종료할 것입니다. 소셜 솔루션에 더 집중하는 것이 좋습니다.
답변2
의견에서 알 수 있듯이 올바른 해결책은 문제를 일으키는 개인과 대화하는 것입니다. 이것이 실패하면 경영진을 통해 문제를 에스컬레이션하세요.
그러나 단지 재미를 위해 문제를 해결하는 방법에 대해 생각해 보았고 필요한 것보다 더 복잡한 솔루션을 설계하고 있다고 생각합니다. 특히 루트 .bashrc에 다음을 추가할 수 있습니다.
alias reboot="killall -9 -u securityguy1 -u securityguy2 -u securityguy3"
일반적으로 원격 재부팅 시 받는 유일한 메시지는 컴퓨터에서 쫓겨났다는 것이며 위 명령은 나열된 모든 사용자를 쫓아냅니다.
다시 한 번 말씀드리지만, 이러지 마세요. 저는 당신의 해고에 대해 어떤 책임도 지지 않습니다.