모든 백그라운드 프로세스를 종료 $(jobs -p)그리고 kill `jobs -p`아무런

몇 가지 Stopped백그라운드 프로세스가 있습니다.

kill $(jobs -p)그리고 kill `jobs -p`아무런 영향을주지 않습니다

kill %1, kill %2, 등을 성공적으로 개별 프로세스를 종료

하나의 명령으로 모든 백그라운드 프로세스를 어떻게 죽일 수 있습니까?

또한 왜 처음 두 명령이 작동하지 않습니까?

Linux Mint 15, 64 비트를 실행 중입니다.



답변

그들이 달릴 때

kill의 출력 과 함께 할 수있는 것처럼 보입니다 jobs -p.

$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960

이제 3 개의 가짜 작업이 실행 중입니다.

$ jobs
[1]   Running                 sleep 1000 &
[2]-  Running                 sleep 1000 &
[3]+  Running                 sleep 1000 &

그들처럼 모두 죽여라.

$ kill $(jobs -p)
[1]   Terminated              sleep 1000
[2]-  Terminated              sleep 1000
[3]+  Terminated              sleep 1000

모두 사라 졌음을 확인합니다.

$ jobs
$

그들이 멈출 때

중지 된 작업이 있으면 실행하지 않고 대신 수행하십시오.

$ kill $(jobs -p)

$ jobs
[1]+  Stopped                 sleep 1000
[2]-  Stopped                 sleep 1000
[3]   Stopped                 sleep 1000

그래, 그들을 죽이지 않았지만 그것은 프로세스 자체에서 kill 신호를 처리 할 수 ​​없기 때문에 중지되었습니다. 따라서 대신 OS를 죽 이도록 지시하십시오. 그것이 무엇을위한 -9것입니다.

$ kill -9 $(jobs -p)
[1]+  Killed                  sleep 1000
[2]-  Killed                  sleep 1000
[3]   Killed                  sleep 1000

그게 낫다.

$ jobs
$ 

일부가 실행 중이고 일부가 중지 된 경우

일부 프로세스가 중지되고 일부 프로세스가 실행중인 혼합 된 프로세스 백이있는 경우 kill첫 번째 작업 다음에을 수행 할 수 있습니다 kill -9.

$ kill $(jobs -p); sleep <time>; \
    kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)

프로세스가 먼저 중지되도록하려면 더 많은 시간이 필요합니다.

신호

죽일 HUP (-1) 또는 SIGTERM (-15)은 성공하지 못합니다. 그런데 왜? 이러한 신호는 애플리케이션이 자체 종료하도록 지시한다는 의미에서 더 친절하기 때문입니다. 그러나 응용 프로그램이 중지 된 상태이므로 이러한 신호를 처리 할 수 ​​없습니다. 따라서 당신은 단지 SIGKILL (-9)을 사용하는 것입니다.

kill와 함께 제공되는 모든 신호를 볼 수 있습니다 kill -l.

$ kill -l | column -t
1)   SIGHUP       2)   SIGINT       3)   SIGQUIT      4)   SIGILL       5)   SIGTRAP
6)   SIGABRT      7)   SIGBUS       8)   SIGFPE       9)   SIGKILL      10)  SIGUSR1
11)  SIGSEGV      12)  SIGUSR2      13)  SIGPIPE      14)  SIGALRM      15)  SIGTERM
16)  SIGSTKFLT    17)  SIGCHLD      18)  SIGCONT      19)  SIGSTOP      20)  SIGTSTP
21)  SIGTTIN      22)  SIGTTOU      23)  SIGURG       24)  SIGXCPU      25)  SIGXFSZ
26)  SIGVTALRM    27)  SIGPROF      28)  SIGWINCH     29)  SIGIO        30)  SIGPWR
31)  SIGSYS       34)  SIGRTMIN     35)  SIGRTMIN+1   36)  SIGRTMIN+2   37)  SIGRTMIN+3
38)  SIGRTMIN+4   39)  SIGRTMIN+5   40)  SIGRTMIN+6   41)  SIGRTMIN+7   42)  SIGRTMIN+8
43)  SIGRTMIN+9   44)  SIGRTMIN+10  45)  SIGRTMIN+11  46)  SIGRTMIN+12  47)  SIGRTMIN+13
48)  SIGRTMIN+14  49)  SIGRTMIN+15  50)  SIGRTMAX-14  51)  SIGRTMAX-13  52)  SIGRTMAX-12
53)  SIGRTMAX-11  54)  SIGRTMAX-10  55)  SIGRTMAX-9   56)  SIGRTMAX-8   57)  SIGRTMAX-7
58)  SIGRTMAX-6   59)  SIGRTMAX-5   60)  SIGRTMAX-4   61)  SIGRTMAX-3   62)  SIGRTMAX-2
63)  SIGRTMAX-1   64)  SIGRTMAX

다양한 신호에 대해 더 자세히 알고 싶으면 신호 매뉴얼 페이지를 살펴 보는 것이 좋습니다 man 7 signal.


답변

당신은 이것을 시도 할 수 있습니다.

for x in `jobs -p`; do kill -9 $x; done

그러나 프로세스를 종료하려면 다음과 같이 명령을 발행 할 수 있습니다.

for x in `jobs -p`; do kill -15 $x; done

로부터 위키 페이지의 Kill명령,

프로세스는 4 가지 방식으로 SIGTERM 신호를 보낼 수 있습니다 (이 경우 프로세스 ID는 ‘1234’입니다).

kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234

프로세스는 세 가지 방법으로 SIGKILL 신호를 보낼 수 있습니다 .

kill -s KILL 1234
kill -KILL 1234
kill -9 1234

에 설명 된대로 답변 , 이것은 terminatekill 의 차이점 입니다.

종료 신호 SIGTERM 은 프로그램에서 인터셉트 할 수있는 신호입니다. 백그라운드에서 실행되는 프로세스는 종종이 신호를 포착하고 종료 프로세스를 시작하여 종료를 깨끗하게합니다. 킬 신호 SIGKILL 은 인터셉트 할 수 없습니다. 이것이 프로세스로 전송되면 해당 프로그램이 갑자기 종료됩니다.

예를 들어 컴퓨터를 종료하거나 다시 부팅하면 일반적으로 SIGTERM 이 실행중인 프로세스로 전송되어 지원되는 경우 깔끔한 방식으로 종료됩니다. 그런 다음 몇 초 후에 SIGKILL 이 여전히 실행중인 프로세스로 전송되어 사용중인 리소스가 강제로 해제 (예 : 사용중인 파일)되고 종료 시퀀스가 ​​계속 될 수 있습니다 (예 : 파일 시스템 마운트 해제).


답변

좋아, 이것으로 놀아서 멈추는 작업을 중단하면 (실행이 일시 중지되었지만 종료되지 않은) 작업이 포 그라운드로 들어갈 때까지 완료되지 않는다는 것을 알 수 있습니다. 일반적으로 터미널에서 CtrlZ를 누르면 프로그램이 중지됩니다 . 대부분의 터미널 SIGSTOP은이 경우에 전송 하지만, 물론 다른 방법으로 전송하는 방법도 있습니다.kill -STOP 또는kill -19 .

에서 SIGTERM보낸 기본 신호 를 처리하기 위해 프로그램을 실행해야하므로 프로그램이 즉시 완료되지 않는 것은 정상적인 동작입니다 kill. 또한, 때로는 후 bash전송 SIGTERM합니다 (이 있지만 백그라운드 프로세스로, 어떻게 든 중지 끝 SIGTERM아직 보류 중입니다).

모든 작업을 완료하는 가장 안전한 방법은로 시작 하지 않고 kill -9먼저 SIGTERMnormal kill로 보낸 다음 SIGCONT나머지 작업 으로 보내는 것입니다. 예 :

kill $(jobs -p)
kill -18 $(jobs -p)

SIGCONT( 18그들은을 처리 할 수 있도록 신호 번호가) 전경에 중지 된 작업을 가져올 것이다 SIGTERM그들은 보통 때와 같이.

모든 프로그램이 이것으로 끝나지 않으면에 의지하기 전에 프로세스가 정상적으로 완료되도록 시도 할 수있는 몇 가지 다른 신호가 있습니다 kill -9. 내가 추천하는 첫 번째 SIGHUP는 대개 다른 종료 신호를 차단하는 많은 프로그램이 응답하기 때문 SIGHUP입니다. 이것은 일반적으로 제어 터미널이 닫힐 때 전송되며, 특히 ssh세션이 tty끝날 때 전송됩니다 . 쉘과 같은 많은 대화식 프로그램은 다른 종료 신호에 응답하지 않지만 ssh세션이 완료된 후 (또는 제어 터미널을 닫은 후에도) 실행 상태를 유지하는 데 문제가 있기 때문에 이에 응답합니다 . 이것을 시도하기 위해 당신은 그렇게 할 수 있습니다

kill -1 $(jobs -p)
kill -18 $(jobs -p)

물론 다시 신호를 처리 할 수 ​​있도록 프로그램이 중지되지 않았는지 확인해야합니다. 시도 할 수있는 다른 종료 신호는 SIGINT( kill -2) 및 SIGQUIT( kill -3)입니다. 그러나 전체 범위를 시도하면 이점이 줄어들고 피할 수없는 결과 SIGKILL(일명 kill -9)가 발생할 수 있습니다 .


답변

현재 쉘의 모든 작업이 하나씩 종료됩니다.

while kill %; do :; done

설명 : %목록에서 마지막 작업을 참조하므로 kill0이 아닌 값을 리턴 할 때까지 반복되므로 종료 할 작업이 더 이상 없습니다.

또 다른 방법은 첫 번째 전송 될 수 있습니다 SIGTERM다음, SIGCONT당신의 작업을 계속할 수 있습니다 그들이 할거야 우선은 당신을받을 수 있도록 SIGTERM.

/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)

(어떤 이유로 빌트인 kill이 이상하기 때문에 외부를 사용했습니다).


답변