동일한 프로세스에서 두 개의 동시 타이머를 사용하려는 스크립트를 작성 중입니다. 아래 예에서는 5초마다 IP를 출력하면서 60초마다 IP 주소를 업데이트하려고 합니다.
while true; do
ip=$(curl -4 -sf ifconfig.co)
sleep 60
done &
while true; do
echo $ip
sleep 5
done
여기서 문제는 첫 번째 루프가 하위 프로세스를 생성하므로 주소 변수를 while
공유하지 않는다는 것입니다 . ip
그러나 을 제거하면 &
스크립트는 두 번째 루프에 들어가지 않습니다.
두 개의 루프를 하나로 통합할 수 있지만 동일한 프로세스에서 두 루프를 동시에 실행하는 더 좋은 방법이 있는지 궁금합니다.
답변1
아니요. bash
이러한 방식의 동시성 또는 멀티스레딩은 지원되지 않습니다. 서브쉘은 또한 변수를 서로 통신하지 않습니다.
FIFO 또는 임시 파일을 사용하여 한 서브셸에서 다른 서브셸로 정보를 전달할 수 있습니다.
예를 들면 다음과 같습니다.
mkfifo hoppa
while true; do
curl -4 -sf ifconfig.co >> hoppa
sleep 60
done &
while : ; do
read -t1 d <> hoppa
if [ "$d" != "" ] ; then
echo '+'
ipread=$d
else
echo -n '.'
fi
echo $ipread
sleep 5
done &