Bash에서 모든 작업을 종료하는 방법은 무엇입니까?

Bash에서 모든 작업을 종료하는 방법은 무엇입니까?

그래서 다음과 같이 작동하는 것이 있습니다.

sleep 30 | sleep 30 &

그것에 대해 생각하는 자연스러운 방법은 다음과 같습니다.

kill `jobs -p`

하지만 이것은 첫 번째 것만 죽이고 sleep두 번째는 죽지 않습니다.

그렇게 하면 두 프로세스가 모두 종료됩니다.

kill %1

그러나 실행 중인 작업이 많으면 최대 하나의 작업이 종료됩니다.

이름은 같지만 이 셸에서 실행되고 있지 않은 프로세스를 종료해서는 안 됩니다.

답변1

xhienne 답변의 짧은 버전이지만 순수한 bash는 아닙니다.

jobs -p | xargs -I{} kill -- -{}

답변2

이것을 사용하십시오 :

pids=( $(jobs -p) )
[ -n "$pids" ] && kill -- "${pids[@]/#/-}"

jobs -p프로세스 그룹 리더의 PID를 인쇄합니다. 음수 PID를 제공함으로써 kill해당 프로세스 그룹()에 속하는 모든 프로세스를 종료합니다 man 2 kill. "${pids[@]/#/-}"배열에 저장된 각 PID를 무효화하면 됩니다 pids.

답변3

사용 kill $( jobs -p )...정말 마음에 듭니다. argv 작업이 너무 많으면 다음을 사용하세요 kill(그런 일이 일어날 수도 있을 것 같습니다):

killalljobs() { for pid in $( jobs -p ); do kill -9 $pid ; done ; }

답변4

이렇게 하면 가장 최근에 생성된 작업부터 시작하여 모든 작업이 종료됩니다.

while kill %%; do :; done

종료할 작업이 더 이상 없으면 중지되고 다음이 인쇄됩니다.

bash: kill: %%: no such job

zsh또한 적용 가능합니다.

관련 정보