그래서 다음과 같이 작동하는 것이 있습니다.
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
또한 적용 가능합니다.