如何在bash中子进程暂停之前获取值

时间:2014-12-08 02:52:45

标签: bash child-process

要求是:

  1. 子进程将返回一个值,IP地址,它使用wget方法
  2. 但是孩子的过程可能会停止。
  3. 父进程无法等待子进程,需要一段时间后返回值。
  4. 可能的脚本是

    parent.sh:

    ./child.sh & 
    sleep 60 
    echo child_return_value
    

    child.sh:

    child_return_value=$(wget ipaddress)
    

3 个答案:

答案 0 :(得分:3)

我会使用wget的-T | --timeout选项在指定的秒数后让请求超时。如果你这样做,你可以完全避免搞乱后台进程和IPC:

return_value=$(wget -T60 -O- ipaddress); ## 60 sec timeout
echo "$return_value";

答案 1 :(得分:3)

只是为了添加另一种可能的方法,如果你的shell支持,你可以在没有(手动)使用进程替换的情况下捕获后台进程的输出。您可以使用read内置来获取输出,这允许设置超时值:

exec 3< <(wget -O- ipaddress);
read -r -u3 -t60;
return_value="$REPLY";
exec 3<&-;
echo "$return_value";

shell将根据此解决方案代表您实际创建FIFO或/ dev / fd / xx特殊文件。

答案 2 :(得分:0)

您可以让子进程将结果写入父进程可以读取的文件。

child_out="$(mktemp)"
./child.sh > "$child_out" &
sleep 60
if [ -s "$child_out" ]
then
    child_return_value=$(cat "$child_out")
else
    # Child did not produce a result yet.
fi

不要忘记删除父脚本中的临时文件。最好使用陷阱,以便在所有(好的,大多数)情况下将其移除。