不使用子进程的并发循环

不使用子进程的并发循环

我正在编写一个脚本,其中我试图在同一进程中使用两个并发计时器。在下面的示例中,我尝试每 60 秒更新一次 IP 地址,同时每 5 秒输出一次 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不支持这种方式的并发或多线程。子 shell 之间也不相互通信变量。

可以使用 FIFO 或临时文件将信息从一个子 shell 传递到另一个子 shell。

举个例子(只是为了让你继续):

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 &

相关内容