![백그라운드 스크립트가 존재하는지 올바르게 폴링하는 방법](https://linux55.com/image/25636/%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EC%A1%B4%EC%9E%AC%ED%95%98%EB%8A%94%EC%A7%80%20%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C%20%ED%8F%B4%EB%A7%81%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음 유형의 스크립트에 문제가 있습니다.
#!/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 루프에서 종료됩니다.
pidof
long_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
차단을 원하지 않는다면 wait
bash에 내장된 작업 제어 기능을 사용하여 이 문제를 해결하겠습니다. 포크가 하나만 있는 프로세스의 경우 매우 간단하게 실행됩니다. 내 접근 방식은 다음과 같습니다.
#!/bin/sh
sleep 1 &
while jobs | grep -q "Running" ; do
echo -n "." # no trailing newline
sleep 0.1
done
echo