killall에 대한 Kinder / gentleer / subtler 동등한 대안 (예 :“endall”)?


17

같은 이름을 가진 모든 프로세스를보다 부드러운 방식으로 끝내려면 어떻게해야 killall합니까? 프로세스를 중단하고 싶지 않지만 제대로 종료 할 시간을 남겨 둡니다.


또한보십시오:

우분투에서 프로세스를 어떻게 죽이나 요?

시스템 모니터에서 Kill Process와 End Process의 차이점은 무엇입니까?

killall (때때로?)을 두 번 적용해야하는 이유는 무엇입니까?

tl; dr


1
그리고 당신의 질문은?
Pilot6

@ Pilot6 re- phrased : killall에 대한 "부드러운"대안은 무엇입니까?
natty에 대해 nutty

1
"부드럽다"는 무엇입니까?
Pilot6

답변:


43

1.`killall`은 이미 멋지다 (SIGTERM)

killall기본적으로을 보냅니다 SIGTERM. 이것은 이미 응용 프로그램이 스스로 정리할 수있는 좋은 방법입니다. "지금 당장 죽어라!" 이 방법은 SIGKILL신호 를 전송하는 것이며 ,이를 옵션으로 지정해야합니다 killall. 에서 는 GNU C 라이브러리 : 종료 신호 :

매크로 : int SIGTERM

[...] 프로그램 종료 를 정중하게 요청하는 일반적인 방법 입니다.


2. 시스템 모니터의 "종료 프로세스"도 동일하게 훌륭함 (SIGTERM)

그놈 시스템 모니터에 관한 질문으로 연결됩니다. 그것은 SIGTERM"끝 프로세스"작업에도 사용됩니다 (그리고 나는 그 질문에 대한 대답과 모순된다는 것을 알고 있습니다). 소스 코드에서 확인할 수 있습니다.

data / menus.ui :

<item>
  <attribute name="label" translatable="yes">_End</attribute>
  <attribute name="action">win.send-signal-end</attribute>
  <attribute name="accel">&lt;Primary&gt;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일 만들기 들여 쓰기 유니폼을.

이 중 어느 것도 변경하지 SIGQUITSIGTERM, 그리고 마지막 하나는 링크 된 질문은 질문 전에에서했다.


7
소스 코드를 참조하기위한 +1! (전통적인 지혜와 상반되는 +2
;;

글쎄, 당신이 대답을 모순한다고 말하기 전에 : 당신 은 소스 코드의 모든 버전 이 사용 되는지 확인 했 15습니까? 이전 버전과 관련 하여 이전 답변 100 % 맞을 있도록 어느 시점에서 변경되었을 있습니다.
Bakuriu

1
@Bakuriu 나는 어느 쪽이든 대답을 모순하지만, 공정한 요점은 다음에 할 수 있는지 확인하는 것을 기억하려고 노력할 것입니다.
hvd

소스 자식 트리의 @Bakuriu는 git grep 'SIGQUIT'아무것도 공개하지 않습니다. 신호와 관련된 것은 없습니다 git grep '>3<'. 나는 아마도 gnome-system-monitor가 결코 사용하지 않았다고 결론 지었다 SIGQUIT.
Ruslan

@Ruslan git grep은 전체 트리가 아닌 현재 트리 만 검색합니다. 나는 git blame(실제로 Github와 동등한) 조금 더 깊이 파고 싶었지만 여전히 아무것도 사용하지 않았습니다.
hvd

5

@ 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모든 프로세스를 종료하려고 시도합니다. 그들 모두. 루트로 실행하면 놀랄 수 있습니다 :)


1
이것이 내가 선호하는 이유 중 하나입니다 pkill. 다른 이유는이 pgrep프로세스가 와 쌍 을 이루기 때문에 어떤 프로세스가 종료되는지, 그리고 어떤 프로세스 자체가보다 일치하는 시맨틱을 갖는지를보다 쉽게 ​​확인할 수 있기 때문 ps | grep입니다.
Random832

1

"모두 종료"는입니다 killall -s SIGQUIT [process name]. 멋진 솔루션을 원한다면을 정의하십시오 alias endall='killall -s SIGQUIT'.


13
SIGQUIT프로세스를 만드는 것과 같습니다 abort(3). 코어를 덤프 한 다음 프로세스를 종료합니다. 이것은 SIGTERM기본값 보다 nice / gentler / kinder가 아닙니다 killall.
Ruslan

3
신호를 처리하는 프로세스 SIGQUIT(또는 더 나은 SIGINT)는보다 '부드럽게'처리 될 수 SIGTERM있지만 이는 응용 프로그램에 달려 있습니다. 처리되지 않으면 그 중 하나가 즉시 종료됩니다.
R .. GitHub 중지 지원 얼음

1
디스크 전체에서 코어 파일을 정리하려면이 방법을 사용하는 것이 좋습니다.
Nate Eldredge

2
@Qix : 신호에 따라 달라지는 것은 응용 프로그램에서 처리하지 않을 때 기본 작업에서 코어 파일을 만들지 여부입니다. 코어 파일을 생성하지 않는 신호를 사용하는 것이 좋습니다.
R .. GitHub 중지 지원 얼음

1
우분투는 기본적으로 코어 파일 크기 제한을 0으로 설정하므로 한계를 수정하지 않으면 SIGQUIT는 실제로 코어 파일 (처리되지 않은 경우)을 생성하지 않습니다.
Roger Light
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.