백그라운드에서 w1
(소스 코드에서) 여러 프로세스 인스턴스를 실행하고 있다고 가정해 보겠습니다(무한 while 루프 포함).while1.c
while1.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}') )
참고: 내가 아는 한 이것은 이식성이 없으며 ps
Linux 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 pid
ps