모든 백그라운드 작업 종료

모든 백그라운드 작업 종료

다음보다 더 간결한 형태의 백그라운드 작업 종료가 있습니까?

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

또한 {1..5}에는 분명히 하드코딩된 매직 넘버가 있습니다. 다음을 수행하지 않고 어떻게 "N"으로 만들 수 있습니까? 여기서 N은 올바른 숫자입니다.

$(jobs | wc -l)

실제로 관리되는 작업 수를 얻기 위해 PS1에서 \j를 사용하고 있습니다. 이것이 동일합니까?

답변1

kill다음에서 관리하는 모든 백그라운드 bash작업 의 경우

kill $(jobs -p)

와 가 모두 내장되어 있으므로 오류가 발생 하지 않아야 jobs합니다 .killbash매개변수 목록이 너무 깁니다.유형.

답변2

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

jobs -p | xargs kill

답변3

나는 출력에 따라 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.

따라서 내 해결책은 다음과 같이 grepPID를 먼저 가져온 다음 사용하는 것입니다.xargs

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

답변4

나는 작업을 종료하기 전에 작업이 존재하는지 확인하는 것을 선호합니다. 이렇게 하면 아무것도 실행되지 않아도 스크립트가 실패하지 않습니다.

타이핑도 짧아집니다. 이것을 당신의 것에 던져라 .bash_profile:

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

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

killjobs

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

관련 정보