쉽게 종료할 수 없는 스크립트를 만드는 방법

쉽게 종료할 수 없는 스크립트를 만드는 방법

응답하지 않는 스크립트를 어떻게 생성합니까 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

관련 정보