
특정 세션 내에서 작업 그룹을 제어할 수 있는 방법이 있습니까 bash
?
이상적으로는 다음과 같이 말하고 싶습니다.
$ prog1 &
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &
그런 다음 종료 kill %FOO
만 하고 prog2
및 prog3
.
답변1
특정 bash 세션 내에서 작업 그룹을 제어할 수 있는 방법이 있습니까?
네, 있어요! - 배열을 사용하여 그룹을 형성하고 이를 사용하여 각 프로세스 ID를 캡처하여 $!
배열에 추가합니다.
$!
는POSIX에서 지정한 특수 매개변수, 가장 최근의 백그라운드 명령의 10진수 프로세스 ID를 제공합니다.
다음은 Bash의 배열에 추가하고 질문의 맥락에서 열거하는 방법에 대한 튜토리얼입니다.
먼저 배열을 선언합니다.
$ GROUP_FOO=()
$ GROUP_BAR=()
그룹에 속하지 않은 작업:
$ prog1 &
FOO 그룹에 들어갈 작업(표기법은 +=
값이 배열에 추가되어야 함을 나타냅니다):
$ prog2 &
$ GROUP_FOO+=($!)
FOO 그룹에 들어갈 또 다른 직업:
$ prog3 &
$ GROUP_FOO+=($!)
BAR 그룹에 들어갈 직업:
$ prog4 &
$ GROUP_BAR+=($!)
FOO 그룹 프로세스를 종료하려면:
$ for id in ${GROUP_FOO[@]}; do kill $id; done
스크립트 버전
이를 스크립팅하는 경우 성공적으로 시작된 경우에만 프로세스 ID가 배열에 추가되도록 약간 수정합니다.
prog2 & sleep 0.1; kill -0 $! && GROUP_FOO+=($!)
이렇게 하면 오류로 인해 즉시 종료되어 실행되지 않는 배열에 프로세스 ID가 있을 가능성이 줄어듭니다. 0.1초의 절전 지연(아마도 0.01초일 수도 있음)은 오류 코드와 함께 종료되는 프로세스 시간을 제공합니다.