PID 대기 및 재활용

PID 대기 및 재활용

스크립트에서 백그라운드에서 실행 중인 함수의 병렬 버전을 호출한 다음 대기를 실행하게 될까봐 걱정됩니다.

a () {
  sleep $1
}

a 10 &
PIDs="$PIDs $!"
a 50000 &
PIDs="$PIDs $!"

wait $PIDs   

문제는 첫 번째 함수 호출은 10초(sleep 10)가 걸리지만 두 번째 함수 호출은 거의 14시간(sleep 50000)이 걸린다는 것입니다.

첫 번째 호출의 PID가 재활용되고 14시간 후 두 번째 호출이 종료되면 해당 PID가 다른 프로세스에서 사용되고 있어 스크립트가 계속 진행되지 않을까 걱정됩니다. 아니면 호출이 완료되자마자 목록에서 첫 번째 PID를 제거하고 두 프로세스가 결국 완료될 때까지 기다리지 않고 두 번째 프로세스가 완료될 때까지 기다리시겠습니까?

답변1

wait내장 함수가 임의 프로세스를 기다리지 않고 현재 셸의 하위 프로세스만 기다리는지 직접 확인하세요 .

#!/bin/bash
sleep 2 &
P=$!
echo sleeping 3 seconds...
sleep 3
echo waiting for $P ...
wait $P
R=$RANDOM
echo waiting for $R ...
wait $R
echo done

$ ./t.sh
sleeping 3 seconds...
waiting for 93208...     ## this returns immediately, since that PID is gone
waiting for 31941 ...
./t.sh: line 10: wait: pid 31941 is not a child of this shell
done

답변2

나는 당신이 Linux를 실행하고 있다고 가정합니다. 반면:

kernel.pid_max기본값 /etc/sysctl.conf은 32768이며 명시적으로 정의되지 않은 경우 적용됩니다 . 다음을 추가하세요.

kernel.pid.max = 4000000

수정된 콘텐츠 로드 sysctl.conf:

# sysctl -p

이는 다운타임이나 기타 중단 없이 수행될 수 있습니다.

관련 정보