모든 백그라운드 프로세스를 종료


10

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

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

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

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

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

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

답변:


10

그들이 달릴 때

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.


왜 우리는 + 첫 번째 프로세스에 -대한 기호가 있고 두 번째 프로세스에 대한 기호가 있고 세 번째 프로세스에 기호 무엇입니까?
Ramesh

나는 당신과 같은 결과를 얻었다. 그러나 나는 그것이 더 안전하다는 것을 읽었 기 때문에 terminate대신에 하고 싶습니다 kill. 나는 시도 kill -15 $(jobs -p)했지만 효과가 없었다. 중지 된 프로세스 kill %number는 종료 될 수 있지만 다시 개별 프로세스를 종료합니다.
user49888 April

@Ramesh +and -는 예제를 설정할 때 마지막으로 터치 한 프로세스입니다. 이는 +명시 적으로 a %#를 포함하지 않는 모든 명령이 해당 명령에 대해 작동 함을 의미합니다 . 대시 ( -)는 마지막으로 터치 한 두 번째 명령입니다.
slm

@ user49888- kill -9 .. 작동했습니다. 프로세스는 무엇입니까? 기능이 없거나 고아가 되었습니까?
slm

1
@ user49888-예 프로세스가 중간에있는 경우 종료하기 전에 정리를 수행 할 기회가 없습니다.
slm

2

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

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 이 여전히 실행중인 프로세스로 전송되어 사용중인 리소스가 강제로 해제 (예 : 사용중인 파일)되고 종료 시퀀스가 ​​계속 될 수 있습니다 (예 : 파일 시스템 마운트 해제).


이것은 kill모든 백그라운드 프로세스를 수행합니다. 그러나 terminate그것이 더 안전하다고 생각하기 때문에 대신 에 그들에게 어떤 방법 이 있습니까?
user49888

종료 -15하려면 kill 명령에서 사용할 수 있습니다 .
Ramesh

-15여기서도 작동하지 않습니다. 내 A.
slm

@Ramesh-마지막 두 단락이 맞지 않습니다. SIGTERM은 전송되지 않습니다 (초기 아님). 서비스 중지 / 시작 스크립트를 통해 프로세스를 먼저 중지하려고 시도합니다. 그것이 9가 프로세스로 전송 된 경우 OP의 예에서와 같이 프로세스가 중지되면 kill -9내 예에서 작동하지 않을 것입니다.
slm

1

좋아, 이것으로 놀아서 멈추는 작업을 중단하면 (실행이 일시 중지되었지만 종료되지 않은) 작업이 포 그라운드로 들어갈 때까지 완료되지 않는다는 것을 알 수 있습니다. 일반적으로 터미널에서 Ctrl- Z를 누르면 프로그램이 중지됩니다 . 대부분의 터미널 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)가 발생할 수 있습니다 .


그렇게 man signal하면 참조 자료를 백업 할 수 있습니다.
slm

이것은 내 A가 제안하는 것보다 더 부드러운 형태입니다. 과거에 여전히 문제가 완전히 해결되지 않는 경우가 있으므로 스크립트 에서이 작업을 수행하면 kill -9 ..대부분 의 경우이 방법이 작동합니다. 때때로 프로세스가 중단되어 더 많은 시간이 실패합니다. 결정해야 할 절충입니다. 손을 대고 모든 것을 죽이는 것이 더 좋으며, 데이터 / 정리의 위험이 적을수록 부드러운 정리가 필요하지만 살인이 점차 가혹해질수록 더 많은 분석을해야합니다.
slm

@ slm, kill -9프로그램을 올바르게 정리할 기회를주지 않고 플러그를 당기기 때문에 가능한 한 피해야 합니다. 몇 가지 대안으로 업데이트하겠습니다.
Graeme

내가 당신의 풍미가 내가 제안한 것보다 더 부드럽다 고 말했듯이, 그것은 당신이하려는 일과 위험의 관점에서 용납하려는 것에 달려 있습니다. 나는 당신뿐만 아니라 내 방법을 사용했습니다. 둘 다 올바른 IMO입니다. 또한 kill ..; sleep <time>; kill -18 ..; 수면 <시간>; -9 ...- 9를 죽 . Basically working up to the 입니다.
slm

@slm kill -18은 작업을 중지하는 것이 일반적이기 때문에 반드시 사용해야하는 것입니다 (일부 경우 bash전송하기 전에 작업 실행을 중지하는 것처럼 보입니다 SIGTERM). 위에서 추가 한 것처럼 다른 SIGHUP프로그램에 응답하지 않는 많은 프로그램이 이에 응답하기 때문에 (쉘로 시도) 시도해 볼 가치가 있습니다. 그럼에도 불구하고, SIGKILL아마도 불가피한 것만 큼 ​​가치가 없습니다 .
Graeme

0

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

while kill %; do :; done

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.