모든 백그라운드 작업 종료


63

백그라운드 작업을 죽이는 것보다 더 간단한 형태가 있습니까?

for i in {1..5}; do kill %$i; done

또한 {1..5}에는 분명히 하드 코딩 된 매직 넘버가 있습니다.

$(jobs | wc -l)

실제로 PS1에서 \ j를 사용하여 관리 작업 수를 얻습니다.


3
kill $(jobs -p)쉬워 보인다.
jw013

가능하면 작업을 개별적으로 종료하는 것을 선호합니다. (하지만 귀하의 의견을 잘못 이해했을 수도 있습니다)
Robottinosino

for pid in $(jobs -p); do kill $pid; done?
jw013

3
@ jw013 jobs작업이 연속적으로 번호가 매겨지는 경우에만 작동 하는 출력 라인 수를 계산하는 솔루션과 달리, 더 쉬울뿐만 아니라 실제로 정확합니다 (답으로 게시하십시오) . 아, 그리고“개별적으로 작업을 죽이는”것은 의미가 없습니다. 여러 PID를 kill명령에 전달하는 것은 개별적으로 전달하는 것과 똑같은 일을합니다.
Gilles

명령을 잘못 입력하고 $ (jobs -p) 단어를 죽이고 나에게도 매우 정확합니다. 수락 할 준비가되었습니다.
Robottinosino

답변:


102

다만하려면 kill관리하는 모든 백그라운드 작업이 bash수행

kill $(jobs -p)

모두 있기 때문에 유의 jobs하고이 kill내장되어 있습니다 bash, 당신은의 오류로 실행하지 않아야 인수 목록이 너무 오래 유형입니다.


2
또한 후손들에게 바하 마트가 생각하는 것은 그것을 zsh주제로하는 권위자로서 실격 시키는 방법이다 .
peth

나는 이것을 알아야한다고 생각하지만 '$'는 어떻게 작동합니까?
fersarr

1
@fersarr 여기 당신은 간다
jw013

@bahamat PID가 작업이 % + 또는 %-중 하나인지 아닌지에 따라 필드 2 또는 3에있을 수 있으므로 실제로 작동하지 않습니다. 작동 kill %${(k)^jobdirs}하는 것은 실제로 더 길다. PID를 나열해야 할 경우 더 오래 사용할 수 있습니다 ${${jobstates#*:*:}%%=*}.
Gilles

CentOS에서 프롬프트가 더 많은 입력을 기다리고 있습니다>
Janac Meena

15

비어 있으면 kill 명령이 실패 하므로 부속 명령 xargs대신에 사용하십시오 .$(jobs -p)jobs -p

jobs -p | xargs kill

1
이것은 동일한 효과를 가지지 만 도움말을 인쇄하고 코드 123으로 종료됩니다
cat

1
이 명령은 OSX에서는 잘 작동하지만 데비안에서는 작동하지 않습니다
brunocascio

이것은 CentOS 6
Janac Meena

jobs -p | xargs -rn10 killjobs -pPID를 반환하지 않으면 더 잘 수행됩니다 . 참고 -r옵션은 GNU 확장이다.
NarūnasK

위에서 언급 한 바와 같이, stdin에 데이터가없는 경우 명령을 실행 하지 않도록 지시 -r하는 --no-run-if-emptyGNU 확장 의 짧은 형식입니다 . xargs
Anthony G-

3

작업을 종료하기 전에 존재하는 작업이 있는지 확인하는 것이 좋습니다. 실행중인 작업이 없으면 스크립트가 실패하지 않습니다.

입력하기도 더 짧습니다. 이것을 당신의 것으로 던져라 .bash_profile:

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

그런 다음 다음을 실행하십시오.

killjobs

실행중인 작업을 종료합니다.


1

macOS에서 각 프로세스에 SIGINT를 보내어 정상적으로 종료하려는 몇 가지 백그라운드 복합 명령이 있습니다. 다른 솔루션은 그 어느 것도 제대로 작동하지 않았으므로 다음과 같이 생각해 냈습니다.

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p 현재 쉘에 의해 시작된 백그라운드 프로세스를 나열합니다.

xargs -n1 각 작업마다 pkill을 한 번 실행합니다.

pkill -SIGINT -g 프로세스 그룹의 모든 프로세스에 SIGINT (ctrl + c와 동일)를 보냅니다.


1

출력에 따라 jobs -p솔루션이 약간 다를 수 있습니다. 나의 경우에는

$ jobs -p
[1]  - 96029 running    some job
[2]  + 96111 running    some other job

따라서 다음을 수행하는 것은 좋지 않습니다.

$ jobs -p | xargs kill
kill: illegal process id: [1]

반면, 실행 kill $(jobs -p)은 작동하지만 비 PID 문자열도 전달되므로 많은 오류 메시지가 발생합니다 kill.

따라서 내 솔루션은 grep먼저 PID 에 대한 xargs다음 다음과 같이 를 사용 합니다.

$ jobs -p | grep -o -E '\s\d+\s' | xargs kill

1
어떤 쉘을 사용하고 있습니까? 무엇을 echo $0보여줍니까? 무엇을 help jobs보여줍니까? 설명 된 출력은 POSIX 호환아닙니다 . 어떤 의 구현은 jobs이 있어야 -p의도 된 행동 옵션을 선택합니다.
와일드 카드

1
이것을 지적 해 주셔서 감사합니다. zsh를 사용하고 있는데 이것이 이상한 출력의 이유입니다. bash로 전환하고 jobs -pPID 만 출력했습니다. 방금 zsh가 완전히 POSIX 호환이 아니라는 것을 알게되었습니다.
Fanchen Bao

0

일을하는 것처럼 보이지만 jobs -p | xargs kill죽일 수있는 원치 않는 출력이 생성됩니다. 여기에 jobs -p+ 또는-문자가 있거나없는 결과를 그룹화 합니다.

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

나중에 전화하면됩니다 killjobs

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