하위 프로세스를 사용하지 않는 동시 루프

하위 프로세스를 사용하지 않는 동시 루프

동일한 프로세스에서 두 개의 동시 타이머를 사용하려는 스크립트를 작성 중입니다. 아래 예에서는 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 &

관련 정보