응답하지 않는 스크립트를 어떻게 생성합니까 Ctrl-C
? 이는 또한 스크립트에 의해 시작된 모든 프로세스가 종료되는 것을 방지해야 합니다(필자는 apt-get upgrade
종료되는 것을 방지하려고 합니다).
(인터넷 검색을 좀 해봤는데 악성 프로세스를 종료하는 방법에 대한 질문만 찾았습니다.)
문맥: 교육용 VM 클러스터용 Linux 마스터 VHD를 만들고 있습니다. 머신이 생성되면 콘솔에 루트로 로그인하고 내 스크립트를 실행합니다. 이 스크립트는 머신을 업데이트하고 새 사용자를 생성하며 SSH를 활성화합니다. 업데이트가 완료되기 전에 누군가 콘솔에 로그인하는 경우 해당 사용자가 업데이트 취소 프로세스를 사용하는 것을 (실수로 또는 의도적으로) 방지하고 싶습니다 Ctrl-C
.
답변1
INT
무시할 신호 설정 :
trap '' INT
이렇게 하면 SIGINT(Ctrl-C에서 보내는 신호)가 스크립트에 아무 작업도 수행하지 않게 됩니다.
이로 인한 사용자 경험 결과에 대해 잘 모르겠습니다. 스크립트가 완료하는 데 오랜 시간이 걸리는 작업에 걸리면 짜증스러울 수 있습니다. 신호를 무시하기 전에 스크립트가 중단되어서는 안 되며 쉽게 중단될 수 없다는 점을 사용자에게 경고하는 것이 더 좋습니다.
답변2
Perl 스크립트를 사용하면 다음과 같이 간단합니다.
#!/usr/bin/perl
use strict;
use warnings;
$SIG{'INT'} = "IGNORE";
#do stuff.
하지만 제가 제안하는 바는, "at" 직업을 고려해 본 적이 있습니까?
echo "sudo apt-get upgrade >> /tmp/upgrade.log" | at now
그러면 스케줄러에서 작업으로 시작됩니다.
답변3
인터럽트를 발행할 터미널이 없도록 프로그램을 백그라운드 작업으로 실행하는 것은 어떨까요 ctrl + c
?
그런 다음 프로세스를 종료하는 유일한 방법은 sudo kill PID
루트 권한이 필요한 명령을 실행하는 것입니다. 하지만 그 사람이 루트 액세스 권한을 가지고 있다면 운이 좋지 않은 것 같아요... 루트 액세스 권한이 있고 프로세스를 종료하고 싶다면...
답변4
무엇을, 어떻게 구축하느냐에 따라 다릅니다.
캡처는 흥미로운 옵션이 될 수 있지만 특정 상황으로 인해 예상대로 작동하지 않을 수도 있다고 생각합니다.
예를 들어, Rails에서 구조 Interrupt
및 구조 Exception
( Interrupt
확장)를 수행하면 프로그램이 인터럽트 신호에서 "예기치 않게" 동작하게 됩니다. Java에서는 캡처의 Throwable
동작이 비슷합니다.
인터럽트 신호를 잡는 것은 좋은 옵션일 수 있지만, 언제 시작하고 언제 중지해야 하는지, 그 사이에 무슨 일이 일어날지, 애플리케이션이 이 "캐치"에 어떻게 반응할지(예: 애플리케이션이 종료될지 여부)를 고려해야 합니다. 예외나 다른 오류가 발생합니까? 애플리케이션을 우회하지만 여전히 apt-get 등을 종료합니다.
또한 kill pid
내가 아는 한 다른 동작을 유발할 수 있으며, kill -9 pid
이는 귀하가 무엇을 하든 프로세스를 종료시킵니다. 나는 이것을 파일에 저장하고 업데이트가 완료될 때까지 해당 파일의 변경 사항을 모니터링하고 (화면에 표시할 수도 있음) 그 동안 SIGINT를 구출/잡기/etc하는 백그라운드 작업으로 실행하는 것을 고려할 것입니다. 또한 런레벨 등을 설정하는 것을 고려하거나 정직한 실수를 피할 수 있도록 kill pid
요구하는 간단한 것을 피할 수도 있습니다.kill -9 pid