중지 된 모든 작업을 어떻게 죽일 수 있습니까?


91

Linux 서버를 종료하려고하면 다음 메시지가 표시됩니다.

중지 된 작업이 있습니다.

: 이것들을 죽이는 하나의 명령이 있습니까?


이 U & L Q & A의 추가 예 : unix.stackexchange.com/questions/124428/…
slm

나는 지금 반대 문제가 있었는데, 쉘을 종료 할 때 중단 된 작업에 대해 경고하지 않을 것입니다! shopt -s checkjobs내 .bashrc 를 넣어 했습니다
Sam Watkins

1
ctrl + d를 다시 누르면 지금 종료하고 프로세스에서 해당 작업을 종료합니다.
Jens Timmerman

답변:


73

bash에서 중지 된 모든 작업을 빠르게 종료하려면 다음을 입력하십시오.

kill -9 `jobs -ps`

jobs -ps-p중지 된 ( -s) 작업 의 프로세스 ID ( )를 나열합니다 .
kill -9 `jobs -ps`모든 SIGKILL 신호를 보냅니다.


22
"kill

1
작업이 "sudo su"일 때 작동하지 않았습니다. 즉 sudo kill `jobs -p`작동하지 않았지만 명시 적으로 PID를 입력했습니다.
user13107

14
왜 이렇게 높게 평가 되나요? 잘못 됐어 프로세스가 중지되면 프로세스 kill와 같이 프로세스가 중지되므로 기본적으로 전송되는 SIGTERM (-15)을 처리하지 않습니다.
slm

6
kill -9는 트릭을 수행합니다.
timetofly

84

이것을 입력하십시오 :

kill -9 $(jobs -p)

9
그렇게해야하지만 SIGKILL (-9)을 보내기 전에 먼저 SIGTERM (-15)을 보내야한다고 생각합니다. "kill $ (jobs -p); sleep 3s; kill -9 $ (jobs -p)"와 같은 것을 제안하는 것이 좋습니다. SIGTERM을 먼저 전송하면 작업이 정리 종료 (할당 된 자원 확보 등)를 수행 할 수 있습니다.
rems

3
케빈 듀크, 당신의 대답은 저에게 효과적이었습니다. 명성이 15 명 없어서 투표 할 수 없었습니다. kill -9 $ (jobs -p)

2
@rems slm이 지적했듯이 SIGTERM은 중지되었으므로 얻을 수 없습니다.
Paul Gear

1
zsh에서는 작동하지 않습니다. zsh가 POS IX 호환 작업이 아니기 때문에 .
Max Coplan

그렇다면 zsh를 처리하는 방법은 무엇입니까?
fx-kirin

16

허용 된 답변은 중지 된 작업뿐만 아니라 모든 작업 (이 경우에는 충분 함)을 종료합니다. 중지 된 항목 만 죽이려면 다음을 실행하십시오.

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

grep / cut은 하나의 awk 명령으로 결합 할 수 있습니다. awk '/Stopped/{print $3}')
laebshade

2
-s허용 된 답변에 대한 논거는 중단 된 것들만
걸러냅니다

12

가장 쉬운 방법은 실제로 즉시 즉시 출구를 재 시도하는 것입니다. bash"중지 된 모든 작업 종료 및 종료"를 의미합니다.


4
그것은 반드시 작업을 멈추지 않는 HUP를 보낼 것입니다.
Stephen Niedzielski

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

2
이 행에 대한 코드 형식을 추가하여 쉽게 읽을 수 있습니다.
drcelus

서식을 다시 볼 수 있습니까? 줄 시작 부분에 4 개의 공백을 사용하여 블록을 코드로 표시하십시오 (백틱을 사용하는 대신). 현재 코드에서 백틱을 사용하는지 또는 백틱을 사용하여 코드를 표시하려고하는지 명확하지 않습니다.
dunxd

서식이 좋습니다. 백틱을 사용하여 -p 작업을 전달해야합니다. 그렇지 않으면 명령으로 간주되지 않으며 오류가 발생합니다.
monu

5

이 방법은 다른 사람에게 도움이 될 수 있습니다. 대부분의 사람들은 쉘을 통해 백그라운드에서 시작된 프로세스를 중지했기 때문에 여기에 있습니다. 다른 사용자가 프로세스를 루트로 중지하여 jobs명령의 변형 이 수행하지 않는 프로세스를 찾아야했습니다 .

약간의 파고 들어 와서이 문제를 해결 man ps했습니다.

ps -a -o pid,user,cmd,state | grep 'T$'

설명 : -a플래그는 모든 프로세스를 표시 한 다음 -o출력 을 제어하며 각 프로세스에 대한 정보를 표시합니다. 내가 선택하고있어 pid, user, cmd(명령 행) 및 state프로세스 상태 .

보낸 사람 man ps:

PROCESS STATE CODES
   Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
   state of a process:
           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped, either by a job control signal or because it is being traced
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

마지막으로 grep T$마지막 열에 T가있는 모든 프로세스를 보여줍니다.

그런 다음 중지 된 상태의 다른 사용자의 모든 프로세스 목록이 있습니다.

$ ps -a -o pid,user,cmd,state | grep 'T$'
  865 joson74+ python                      T
  885 joson74+ sh -c less                  T
  886 joson74+ less                        T
 1014 minames+ python3.4 -i /home/minames  T
 5352 MooKo    nano stdio.h                T
 7851 harry    tmux attach                 T
12083 harry    tmux attach                 T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d   vim                         T
19664 enythin+ python                      T
24906 wardlist python                      T

현재 쉘에 연결된 작업을 중지하려면 jobs -ps이 답변보다 간단합니다. 즉,이 답변에는 Ctrl-Z쉘에서 중지 된 작업 만 표시되는 것이 아니라 모든 중지 된 작업 : 다른 쉘, 디버깅중인 작업을 포함하여 다른 사용자 (예 : gdb).
Stéphane Gourichon

나에게 가장 좋은 대답이지만 정확히 작동하지는 않습니다. ps -el | grep T'T'상태의 프로세스를 찾는 데 사용해야 했습니다.
dr0i

4

일부 중지 된 작업을 제거하고 일부만 제거하려면 다음을 시도하십시오.

먼저 작업을 나열하면 다음과 같은 결과가 나타납니다.

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

중지 된 작업에 kill을 보내면 포 그라운드로 가져 오는 것 외에는 아무것도 수행하지 않고 종료됩니다.

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4

일반적으로 해당 메시지가 표시되면 두 번 로그 아웃해야합니다. 예를 들어 먼저 Ctrl+D중지 된 작업에 대한 경고 메시지를 표시하고 두 번째를 누르면 작업 종료를 로그 아웃합니다. 이 명령 logoutexit명령 에도 동일하게 적용됩니다 .

수동으로 종료하려면 다음을 시도하십시오 kill $(jobs -p)..


현재 쉘에서 작업을 종료하지 않으려면 disown명령 을 사용하여 종료하지 않고 활성 작업 테이블에서 작업을 제거 할 수 있습니다 . 예 :

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

중지 된 작업은 프로세스 상태 ( T문자)에 의해 결정될 수도 있습니다. 이는 프로세스가 SIGSTOP, SIGTSTP또는 기타 (예 SIGTTIN: 또는 SIGTTOU) 와 같은 신호에 의해 중지되었음을 의미합니다 .

경우 jobs쉘 내부 명령을 사용할 수없는 프로세스는 다음 명령으로 나열 할 수 있습니다 중지 :

ps wuax | awk '$8 ~ "T"'

그들을 모두 죽이려면 기본적으로 다음을 입력하십시오.

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

간단한 테스트는 다음과 같습니다.

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.