답변:
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
.
terminate
대신에 하고 싶습니다 kill
. 나는 시도 kill -15 $(jobs -p)
했지만 효과가 없었다. 중지 된 프로세스 kill %number
는 종료 될 수 있지만 다시 개별 프로세스를 종료합니다.
+
and -
는 예제를 설정할 때 마지막으로 터치 한 프로세스입니다. 이는 +
명시 적으로 a %#
를 포함하지 않는 모든 명령이 해당 명령에 대해 작동 함을 의미합니다 . 대시 ( -
)는 마지막으로 터치 한 두 번째 명령입니다.
kill -9 ..
작동했습니다. 프로세스는 무엇입니까? 기능이 없거나 고아가 되었습니까?
당신은 이것을 시도 할 수 있습니다.
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
에 설명 된대로 이 답변 , 이것은 terminate 와 kill 의 차이점 입니다.
종료 신호 SIGTERM 은 프로그램에서 인터셉트 할 수있는 신호입니다. 백그라운드에서 실행되는 프로세스는 종종이 신호를 포착하고 종료 프로세스를 시작하여 종료를 깨끗하게합니다. 킬 신호 SIGKILL 은 인터셉트 할 수 없습니다. 이것이 프로세스로 전송되면 해당 프로그램이 갑자기 종료됩니다.
예를 들어 컴퓨터를 종료하거나 다시 부팅하면 일반적으로 SIGTERM 이 실행중인 프로세스로 전송되어 지원되는 경우 깔끔한 방식으로 종료됩니다. 그런 다음 몇 초 후에 SIGKILL 이 여전히 실행중인 프로세스로 전송되어 사용중인 리소스가 강제로 해제 (예 : 사용중인 파일)되고 종료 시퀀스가 계속 될 수 있습니다 (예 : 파일 시스템 마운트 해제).
kill
모든 백그라운드 프로세스를 수행합니다. 그러나 terminate
그것이 더 안전하다고 생각하기 때문에 대신 에 그들에게 어떤 방법 이 있습니까?
-15
하려면 kill 명령에서 사용할 수 있습니다 .
-15
여기서도 작동하지 않습니다. 내 A.
kill -9
내 예에서 작동하지 않을 것입니다.
좋아, 이것으로 놀아서 멈추는 작업을 중단하면 (실행이 일시 중지되었지만 종료되지 않은) 작업이 포 그라운드로 들어갈 때까지 완료되지 않는다는 것을 알 수 있습니다. 일반적으로 터미널에서 Ctrl- Z를 누르면 프로그램이 중지됩니다 . 대부분의 터미널 SIGSTOP
은이 경우에 전송 하지만, 물론 다른 방법으로 전송하는 방법도 있습니다.kill -STOP
또는kill -19
.
에서 SIGTERM
보낸 기본 신호 를 처리하기 위해 프로그램을 실행해야하므로 프로그램이 즉시 완료되지 않는 것은 정상적인 동작입니다 kill
. 또한, 때로는 후 bash
전송 SIGTERM
합니다 (이 있지만 백그라운드 프로세스로, 어떻게 든 중지 끝 SIGTERM
아직 보류 중입니다).
모든 작업을 완료하는 가장 안전한 방법은로 시작 하지 않고 kill -9
먼저 SIGTERM
normal 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
하면 참조 자료를 백업 할 수 있습니다.
kill -9 ..
대부분 의 경우이 방법이 작동합니다. 때때로 프로세스가 중단되어 더 많은 시간이 실패합니다. 결정해야 할 절충입니다. 손을 대고 모든 것을 죽이는 것이 더 좋으며, 데이터 / 정리의 위험이 적을수록 부드러운 정리가 필요하지만 살인이 점차 가혹해질수록 더 많은 분석을해야합니다.
kill -9
프로그램을 올바르게 정리할 기회를주지 않고 플러그를 당기기 때문에 가능한 한 피해야 합니다. 몇 가지 대안으로 업데이트하겠습니다.
kill ..; sleep <time>; kill -18 ..
; 수면 <시간>; -9 ...- 9를 죽 . Basically working up to the
입니다.
kill -18
은 작업을 중지하는 것이 일반적이기 때문에 반드시 사용해야하는 것입니다 (일부 경우 bash
전송하기 전에 작업 실행을 중지하는 것처럼 보입니다 SIGTERM
). 위에서 추가 한 것처럼 다른 SIGHUP
프로그램에 응답하지 않는 많은 프로그램이 이에 응답하기 때문에 (쉘로 시도) 시도해 볼 가치가 있습니다. 그럼에도 불구하고, SIGKILL
아마도 불가피한 것만 큼 가치가 없습니다 .
현재 쉘의 모든 작업이 하나씩 종료됩니다.
while kill %; do :; done
설명 : %
목록에서 마지막 작업을 참조하므로 kill
0이 아닌 값을 리턴 할 때까지 반복되므로 종료 할 작업이 더 이상 없습니다.
또 다른 방법은 첫 번째 전송 될 수 있습니다 SIGTERM
다음, SIGCONT
당신의 작업을 계속할 수 있습니다 그들이 할거야 우선은 당신을받을 수 있도록 SIGTERM
.
/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)
(어떤 이유로 빌트인 kill
이 이상하기 때문에 외부를 사용했습니다).
+
첫 번째 프로세스에-
대한 기호가 있고 두 번째 프로세스에 대한 기호가 있고 세 번째 프로세스에 기호 무엇입니까?