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일 만들기 들여 쓰기 유니폼을.

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


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.