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

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

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. 이는 일반적으로 제어 터미널이 닫힐 때, 특히 세션이 끝날 때 전송됩니다 . 쉘과 같은 많은 대화형 프로그램은 다른 종료 신호가 아닌 이 신호에 응답합니다. 세션이 끝난 후에도(또는 제어 터미널이 닫힌 후에도) 계속 실행되는 것이 문제가 되기 때문입니다. 이것을 시도하려면 다음을 수행하십시오.SIGHUPSIGHUPsshttyssh

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

물론, 신호를 처리할 수 있도록 프로그램이 정지되지 않았는지 다시 확인해야 합니다. 시도해 볼 수 있는 다른 종료 신호는 SIGINT( kill -2) 및 SIGQUIT( kill -3)입니다. 그러나 물론 전체 스펙트럼을 시도함으로써 얻을 수 있는 이점은 줄어들고 불가피한 결과 SIGKILL(일명 kill -9)로 이어질 수도 있습니다.

답변4

그러면 현재 셸의 모든 작업이 하나씩 종료됩니다.

while kill %; do :; done

설명: %목록의 마지막 작업을 참조하므로 kill0이 아닌 값이 반환될 때까지 반복됩니다. 즉, 더 이상 종료할 작업이 없음을 의미합니다.

또 다른 접근 방식은 먼저 를 보내는 것입니다 SIGTERM. 그런 다음 SIGCONT작업을 계속할 수 있고 가장 먼저 해야 할 일은 을(를) 받는 것입니다 SIGTERM.

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

(내장된 것이 왠지 이상해서 kill여기서는 외부를 사용하고 있습니다.)

관련 정보