같은 이름을 가진 모든 프로세스를보다 부드러운 방식으로 끝내려면 어떻게해야 killall
합니까? 프로세스를 중단하고 싶지 않지만 제대로 종료 할 시간을 남겨 둡니다.
또한보십시오:
시스템 모니터에서 Kill Process와 End Process의 차이점은 무엇입니까?
같은 이름을 가진 모든 프로세스를보다 부드러운 방식으로 끝내려면 어떻게해야 killall
합니까? 프로세스를 중단하고 싶지 않지만 제대로 종료 할 시간을 남겨 둡니다.
또한보십시오:
시스템 모니터에서 Kill Process와 End Process의 차이점은 무엇입니까?
답변:
killall
기본적으로을 보냅니다 SIGTERM
. 이것은 이미 응용 프로그램이 스스로 정리할 수있는 좋은 방법입니다. "지금 당장 죽어라!" 이 방법은 SIGKILL
신호 를 전송하는 것이며 ,이를 옵션으로 지정해야합니다 killall
. 에서 는 GNU C 라이브러리 : 종료 신호 :
매크로 : int SIGTERM
[...] 프로그램 종료 를 정중하게 요청하는 일반적인 방법 입니다.
그놈 시스템 모니터에 관한 질문으로 연결됩니다. 그것은 SIGTERM
"끝 프로세스"작업에도 사용됩니다 (그리고 나는 그 질문에 대한 대답과 모순된다는 것을 알고 있습니다). 소스 코드에서 확인할 수 있습니다.
<item>
<attribute name="label" translatable="yes">_End</attribute>
<attribute name="action">win.send-signal-end</attribute>
<attribute name="accel"><Primary>e</attribute>
<attribute name="target" type="i">15</attribute>
</item>
여기 15는 신호 번호입니다. 신호 15는 SIGTERM
입니다. 그리고 시스템 모니터는 SIGTERM
다른 질문을하기 전에 잘 사용했습니다 .
의 Github 표현을 살펴보면 git blame
, 그놈 시스템 모니터의 소스 코드에서 신호의 철자가 어떻게 변경되었는지 다음과 같이 변경되었습니다.
383007f2 GAction 매개 변수를 사용하여 신호를 보내는 2013년 7월 24일 대체 중복 된 코드는
0e766b2d GAction에 2013년 7월 18일 포트 과정 팝업 메뉴를
97674c79 2012년 10월 3일 가져 ProcData 구조를 제거
38c5296c 소스 파일에 걸쳐 2011년 7월 3일 만들기 들여 쓰기 유니폼을.
이 중 어느 것도 변경하지 SIGQUIT
에 SIGTERM
, 그리고 마지막 하나는 링크 된 질문은 질문 전에에서했다.
15
습니까? 이전 버전과 관련 하여 이전 답변 이 100 % 맞을 수 있도록 어느 시점에서 변경되었을 수 있습니다.
git grep 'SIGQUIT'
아무것도 공개하지 않습니다. 신호와 관련된 것은 없습니다 git grep '>3<'
. 나는 아마도 gnome-system-monitor가 결코 사용하지 않았다고 결론 지었다 SIGQUIT
.
git grep
은 전체 트리가 아닌 현재 트리 만 검색합니다. 나는 git blame
(실제로 Github와 동등한) 조금 더 깊이 파고 싶었지만 여전히 아무것도 사용하지 않았습니다.
@ hvd의 대답은 기본적으로 정확합니다. 이를 더 많이 백업하기 위해 init
프로세스는 SIGTERM
컴퓨터를 종료 할 때 프로세스로 먼저 전송 한 다음, SIGKILL
아직 종료되지 않은 경우 지연 후에 전송 합니다. 프로세스는 처리 / 무시할 수 없습니다 SIGKILL
.
좀 더 자세하게 말하면, 실제 대답은 프로그램이 그것을 처리하는지 확실하게 알 수 없다는 것입니다. SIGTERM
은 프로그램이 정중하게 종료하도록 요청하는 데 가장 일반적으로 사용되는 신호이지만 모든 신호 처리는 신호로 무언가를 수행하는 프로그램에 따라 다릅니다.
@Jos 또는 @AlexGreg에 의해 작성된 프로그램이 있다면 다른 답변을 기반으로 다른 방법으로 넣으려면 아마도 처리 SIGQUIT
하지만 아마도 아닐 수 SIGTERM
있기 때문에 보내는 SIGTERM
것이 "부드럽 지 않은"것보다 적습니다 SIGQUIT
.
코드를 직접 작성하여 직접 재생할 수 있습니다. 아래 저장 signal-test.c
한 후 컴파일
gcc -o signal-test signal-test.c
그런 다음을 실행하고 ./signal-test
로 다른 신호를 보낼 때 어떤 일이 발생하는지 확인할 수 있습니다 killall -s <signal>
.
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag = 0;
void handle_signal(int s)
{
flag = s;
}
int main(int argc, char *argv[])
{
signal(SIGTERM, handle_signal);
signal(SIGQUIT, handle_signal);
while(flag == 0){
sleep(1);
}
printf("flag is %d\n", flag);
return flag;
}
코드는 SIGTERM과 SIGQUIT를 정상적으로 처리합니다. 라인 시작 부분에 signal(SIG...
a //
를 사용하여 라인을 주석 처리하여 신호 처리기를 제거한 다음 신호를 다시 실행하여 보낼 수 있습니다. 다음과 같은 다른 출력을 볼 수 있어야합니다.
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
신호 처리 여부에 따라
신호를 무시해도됩니다.
signal(SIGTERM, SIG_IGN);
그렇게하면 전송 SIGTERM
이 아무것도하지 않으므로 SIGKILL
프로세스를 끝내기 위해 사용해야 합니다.
더 많은 세부 사항 man 7 signal
. signal()
이 방법으로 사용 하는 것은 이식 불가능한 것으로 간주됩니다-대안보다 훨씬 쉽습니다!
다른 하나의 작은 각주-Solaris에서 killall
모든 프로세스를 종료하려고 시도합니다. 그들 모두. 루트로 실행하면 놀랄 수 있습니다 :)
pkill
. 다른 이유는이 pgrep
프로세스가 와 쌍 을 이루기 때문에 어떤 프로세스가 종료되는지, 그리고 어떤 프로세스 자체가보다 일치하는 시맨틱을 갖는지를보다 쉽게 확인할 수 있기 때문 ps | grep
입니다.
"모두 종료"는입니다 killall -s SIGQUIT [process name]
. 멋진 솔루션을 원한다면을 정의하십시오 alias endall='killall -s SIGQUIT'
.
SIGQUIT
프로세스를 만드는 것과 같습니다 abort(3)
. 코어를 덤프 한 다음 프로세스를 종료합니다. 이것은 SIGTERM
기본값 보다 nice / gentler / kinder가 아닙니다 killall
.
SIGQUIT
(또는 더 나은 SIGINT
)는보다 '부드럽게'처리 될 수 SIGTERM
있지만 이는 응용 프로그램에 달려 있습니다. 처리되지 않으면 그 중 하나가 즉시 종료됩니다.