스크립트에서 백그라운드에서 실행 중인 함수의 병렬 버전을 호출한 다음 대기를 실행하게 될까봐 걱정됩니다.
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
이는 다운타임이나 기타 중단 없이 수행될 수 있습니다.