Stopped
몇 가지 백그라운드 프로세스 가 있습니다 .
kill $(jobs -p)
그리고 kill `jobs -p`
효과도 없고
kill %1
등을 사용 하여 kill %2
각 프로세스를 성공적으로 종료합니다.
하나의 명령으로 모든 백그라운드 프로세스를 종료하는 방법은 무엇입니까?
또한 처음 두 명령이 나에게 작동하지 않는 이유는 무엇입니까?
저는 Linux Mint 15, 64비트를 실행하고 있습니다.
답변1
그들이 달릴 때
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
글쎄요, 그것이 그들을 죽이지는 않았지만 프로세스 자체가 종료 신호를 처리할 수 없었기 때문에 중단되었습니다. 그러니 OS에게 죽이라고 말하세요. 그것이 바로 a -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
.
답변2
이것을 시도해 볼 수 있습니다.
for x in `jobs -p`; do kill -9 $x; done
그러나 프로세스를 종료하려면 다음 명령을 실행할 수 있습니다.
for x in `jobs -p`; do kill -15 $x; done
~에서위키피디아명령 페이지 Kill
,
프로세스는 다음을 보낼 수 있습니다.신호 용어신호는 네 가지 방법으로 전송됩니다(이 경우 프로세스 ID는 "1234"입니다).
kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234
프로세스를 보낼 수 있습니다.신호 살해신호를 보내는 세 가지 방법:
kill -s KILL 1234
kill -KILL 1234
kill -9 1234
설명된 대로이것답변, 이것이 차이점입니다종료그리고죽이다.
종료 신호,신호 용어, 은 프로그램에서 가로챌 수 있는 신호입니다. 일반적으로 백그라운드에서 실행 중인 프로세스는 이 신호를 포착하고 종료 프로세스를 시작하여 완전히 종료됩니다. 킬 신호,신호 살해, 차단할 수 없습니다. 프로세스로 전송되면 프로그램이 갑자기 종료됩니다.
예를 들어, 컴퓨터를 종료하거나 다시 시작하면 일반적으로 다음과 같은 메시지가 나타납니다.신호 용어실행 중인 프로세스에 먼저 전송되어 지원하는 경우 완전히 종료할 수 있습니다. 그러다가 몇 초 뒤에신호 살해사용 중인 리소스(예: 사용 중인 파일)가 강제로 해제되고 종료 시퀀스가 계속될 수 있도록(예: 파일 시스템 마운트 해제) 계속 실행 중인 프로세스로 전송됩니다.
답변3
좋아, 이것을 가지고 놀면서 중지된 작업(실행이 일시 중지되었지만 종료되지 않은 경우)을 종료하면 포그라운드로 가져올 때까지 완료되지 않는다는 것을 발견했습니다. 프로그램은 일반적 으로 터미널에서 -를 누르면 Ctrl중지됩니다 . Z대부분의 단말기는 이 경우에 전송하지만 SIGSTOP
, 물론 kill -STOP
이나 를 사용하는 등 다른 전송 방법도 있습니다 kill -19
.
SIGTERM
전송된 기본 신호를 처리하려면 프로그램이 실행 중이어야 하기 때문에 프로그램이 즉시 완료되지 않는 것은 정상적인 동작입니다 kill
. 또한 때로는 백그라운드 프로세스로 bash
보낸 후 SIGTERM
어떻게든 중지되는 경우도 있습니다( SIGTERM
여전히 정지 상태임에도 불구하고).
모든 일을 완료하는 가장 안전한 방법(아니요kill -9
) 먼저 SIGTERM
일반 전송을 수행 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
)로 이어질 수도 있습니다.
답변4
그러면 현재 셸의 모든 작업이 하나씩 종료됩니다.
while kill %; do :; done
설명: %
목록의 마지막 작업을 참조하므로 kill
0이 아닌 값이 반환될 때까지 반복됩니다. 즉, 더 이상 종료할 작업이 없음을 의미합니다.
또 다른 접근 방식은 먼저 를 보내는 것입니다 SIGTERM
. 그런 다음 SIGCONT
작업을 계속할 수 있고 가장 먼저 해야 할 일은 을(를) 받는 것입니다 SIGTERM
.
/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)
(내장된 것이 왠지 이상해서 kill
여기서는 외부를 사용하고 있습니다.)