스크립트에서 프로세스의 여러 인스턴스 PID를 가져와 사용합니다.

스크립트에서 프로세스의 여러 인스턴스 PID를 가져와 사용합니다.

백그라운드에서 w1(소스 코드에서) 여러 프로세스 인스턴스를 실행하고 있다고 가정해 보겠습니다(무한 while 루프 포함).while1.cwhile1.c

gcc while1.c -o w1
./w1&
./w1&
./w1&
./w1&

이제 각 인스턴스의 PID를 얻고 싶습니다. 이를 위해 나는 다음과 같이 하고 있습니다.

var=$(/bin/ps r -o pid,cmd|grep "w1"| grep -v "grep"|awk '{print $1}')

w1이는 의 모든 인스턴스의 PID를 저장합니다 $var.
그렇다면 다음과 같이 하세요.

echo $var

모든 인스턴스의 PID를 인쇄합니다 w1.

하지만 개별 PID에 액세스하고 싶습니다. 즉:

echo ${var[0]}
echo ${var[1]}

등(배열 등). 어떻게 해야 하나요?

추신: echo ${var[0]}모든 PID가 인쇄되는 반면 echo ${var[1]}echo ${var[2]}은 아무것도 인쇄하지 않습니다(예: 출력의 빈 줄).

답변1

프로세스를 시작할 때 PID를 저장하십시오.

pids=()

./w1 & pids+=( "$!" )
./w1 & pids+=( "$!" )
./w1 & pids+=( "$!" )
./w1 & pids+=( "$!" )

(쉘에 bash호환 가능한 배열 구문이 있다고 가정)

이제 배열에 PID가 있으며 등을 통해 pids액세스 할 수 있습니다."${pids[0]}""${pids[1]}"

일반을 사용하는 경우 /bin/sh:

set --

./w1 & set -- "$@" "$!"
./w1 & set -- "$@" "$!"
./w1 & set -- "$@" "$!"
./w1 & set -- "$@" "$!"

이제 귀하의 PID가 목록에 있으며 등을 통해 "$@"액세스 할 수 있습니다."$1""$2"

이 특수 값은 "$!"가장 최근에 시작된 백그라운드 명령의 PID가 됩니다.

답변2

Bash를 실행하는 경우 이를 사용할 수 jobs -l있으며 백그라운드 작업과 해당 PID가 나열됩니다. 예를 들어 다음 명령은 일치하는 모든 작업의 ​​PID를 ./w1배열에 저장합니다 pids.

pids=( $(jobs -l | awk '/\.\/w1/ {print $2}') )

다른 셸에서는 이를 사용하여 ps --ppid $$현재 셸을 상위로 갖는 모든 작업을 나열할 수 있습니다.

pids=( $(ps --ppid $$ -o pid,cmd -h | awk '/\.\/w1/ {print $1}') )

참고: 내가 아는 한 이것은 이식성이 없으며 psLinux procps패키지에서만 사용할 수 있습니다. 다른 버전에는 ps동일한 옵션이 없습니다.

FreeBSD를 사용하면 ps다음과 같은 작업을 수행할 수 있습니다(bash, ksh 또는 기타 배열 인식 쉘에서):

pids=( $(ps -j | awk -v ppid=$$ '$3==ppid && /\.\/w1/ {print $2}') )

시간이 있으면 pgrep다음을 사용할 수 있습니다.

pids=( $(pgrep -P $$ w1) )

모든 변형에서 백그라운드 프로세스가 일치하는지 확인합니다 ./w1. PPID가 다른 하위 프로세스 또는 백그라운드 프로세스를 절대 실행하지 않을 것이라고 확신하는 경우 스크립트에서 해당 테스트를 건너뛸 수 있습니다 (그리고 두 번째 변형 본문의 명령 에 awk출력이 필요합니다) ).-o pidps

관련 정보