백그라운드 스크립트가 존재하는지 올바르게 폴링하는 방법

백그라운드 스크립트가 존재하는지 올바르게 폴링하는 방법

다음 유형의 스크립트에 문제가 있습니다.

  #!/bin/sh

  long_running_script.sh &  

  while [ `pidof long_running_script.sh` ]
  do
    echo "."
    sleep 1
  done

이 스크립트는 백그라운드에서 새 스크립트를 시작하고 백그라운드 스크립트가 종료될 때까지 포인트를 인쇄해야 합니다. CPU 부하가 높지 않을 때 작동합니다.

그러나 CPU 부하가 높으면 작동하지 않습니다. long_running_script.sh가 시작되지만 "상위" 스크립트는 long_running_script.sh가 종료되기 전에 while 루프에서 종료됩니다.

pidoflong_running_script.sh가 실제로 시작(실행)되기 전에 실행 되는 것 같습니다 .

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

while 문이 나오기 전에 1초 동안 자는 것은 도움이 되지 않습니다. 따라서 신뢰할 수 없는 마법 지연을 사용하고 싶지 않습니다.

답변1

pidof프로세스 이름의 첫 번째 부분( argv[0])만 확인하므로 스크립트를 찾을 수 없습니다.

을 사용할 수 있지만 pidof -m이것은 다음을 찾을 것입니다어느 long_running_script.sh, 이 스크립트로 시작된 것이 아닙니다.

$!더 나은 접근 방식은 가장 최근 백그라운드 작업의 PID를 보유하는 변수를 사용하는 것입니다 .

#!/bin/bash

long_running_script.sh &  
pid=$!

while ps -p $pid >/dev/null
do
    echo "."
    sleep 1
done

답변2

차단을 원하지 않는다면 waitbash에 내장된 작업 제어 기능을 사용하여 이 문제를 해결하겠습니다. 포크가 하나만 있는 프로세스의 경우 매우 간단하게 실행됩니다. 내 접근 방식은 다음과 같습니다.

#!/bin/sh

sleep 1 &

while jobs | grep -q "Running" ; do
    echo -n "."     # no trailing newline
    sleep 0.1
done

echo 

답변3

사용 wait:

#!/bin/sh
  long_running_script.sh &  
  wait
  echo "done"

자세한 내용은.

관련 정보