Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等待多个bash函数finsih或在超时时退出它们_Bash_Shell - Fatal编程技术网

等待多个bash函数finsih或在超时时退出它们

等待多个bash函数finsih或在超时时退出它们,bash,shell,Bash,Shell,在中有一个我在循环中并行调用的函数: #!/bin/bash my_func() { until [[ $entity status is OK ]]; do sleep 5 echo "count=$count" if (( timeout_flag == 1 )); then break fi done } _arr=(e1 e2 e3) count=0 timeout=60 time

在中有一个我在循环中并行调用的函数:

#!/bin/bash

my_func()
{
    until [[ $entity status is OK ]]; do
        sleep 5
        echo "count=$count"
        if (( timeout_flag == 1 )); then
            break
        fi
    done
}

_arr=(e1 e2 e3)
count=0
timeout=60
timeout_flag=0

for entity in "${_arr[@]}"; do
    my_func "${entity}" &
done

while [[ "${count}" -lt "${timeout}" ]]; do
    sleep 5
    count=count+5
done
timeout_flag=1
echo "Timeout reached"
sleep 1
我希望所有函数定期检查,直到实体的状态为OK,然后等待所有OK状态,或者在达到超时时停止所有(剩余)函数?先到先得。上面的方法似乎不起作用,我需要手动杀死它

  • 为什么我在最后得到了
    “Timeout reated”
    的回音,而脚本没有等待函数完成

  • 为什么my_func中的计数=0且不增加


如果要在60秒后使每个功能超时,可以使用命令;这正是为了:

#/bin/bash
my_func(){
睡眠=1美元
stdbuf-oL echo“请求睡眠至少$to_sleep s”
睡眠=0
当[[$sleep-lt$to_sleep]];执行
睡眠1
睡眠=$((睡眠+1))
完成
echo“已成功睡眠$sleeps($to_sleep s request)”
}
导出-f my_func
_arr=(1 3 5)
最大时间=4s
对于“${u arr[@]}”中的实体;做
stdbuf-oL echo“使用$entity s启动”
超时$maxtime bash-c“我的函数$entity”&
完成
输出是

Launching with 1 s
Launching with 3 s
Launching with 5 s
Request to sleep at least 1 s
Request to sleep at least 3 s
Request to sleep at least 5 s
Successfully slept 1 s (1 s requested)
Successfully slept 3 s (3 s requested)
请注意,“5S”案例没有成功

注:

  • stdbuf-oL
    用于直接刷新回波输出
  • 添加了
    export-f my_func
    timeout$maxtime bash-c
    以使函数在
    timeout
    启动的新shell中可见,如下所示
如果要在60秒后使每个功能超时,可以使用命令;这正是为了:

#/bin/bash
my_func(){
睡眠=1美元
stdbuf-oL echo“请求睡眠至少$to_sleep s”
睡眠=0
当[[$sleep-lt$to_sleep]];执行
睡眠1
睡眠=$((睡眠+1))
完成
echo“已成功睡眠$sleeps($to_sleep s request)”
}
导出-f my_func
_arr=(1 3 5)
最大时间=4s
对于“${u arr[@]}”中的实体;做
stdbuf-oL echo“使用$entity s启动”
超时$maxtime bash-c“我的函数$entity”&
完成
输出是

Launching with 1 s
Launching with 3 s
Launching with 5 s
Request to sleep at least 1 s
Request to sleep at least 3 s
Request to sleep at least 5 s
Successfully slept 1 s (1 s requested)
Successfully slept 3 s (3 s requested)
请注意,“5S”案例没有成功

注:

  • stdbuf-oL
    用于直接刷新回波输出
  • 添加了
    export-f my_func
    timeout$maxtime bash-c
    以使函数在
    timeout
    启动的新shell中可见,如下所示

复制并粘贴脚本以查看错误,阅读子shell以了解逻辑不起作用的原因。睡眠循环的意义是什么?它不检查任何东西,只是(在修复时)增加一个变量并再次休眠。。。另外,检查一下命令?@Keldorn我想增加计数器,这样一旦达到超时,我就可以设置运行函数的标志,注意
count=count+5
不是很有用;它将字符串
“count+5”
分配给变量
count
。您可能想到了
count=$($count+5))
或主题的变体,例如
((count+=5))
。复制并粘贴脚本以查看错误,并阅读有关子shell的内容以了解逻辑不起作用的原因。睡眠循环的意义是什么?它不检查任何东西,只是(在修复时)增加一个变量并再次休眠。。。另外,检查一下命令?@Keldorn我想增加计数器,这样一旦达到超时,我就可以设置运行函数的标志,注意
count=count+5
不是很有用;它将字符串
“count+5”
分配给变量
count
。您可能想到了
count=$($count+5))
或主题的变体,例如
((count+=5))
。我得到
超时:无法运行命令“my_func”:没有这样的文件或目录
@lubik
my_func
是您要调用的函数。替换为您想要的。这就是我正在做的,
my_func
是我的function@lubik哎呀,该函数不可用。我用更新了我的答案。谢谢,效果很好。我有另一个输入错误,在超时命令的末尾加上了双引号。然而,我需要点击输入终端返回到主shell,因为子shell将显示其输出,直到它们超时为止。这会自动工作吗?例如,在Jenkins.I获得
timeout:无法运行命令'my_func':没有这样的文件或目录
@lubik
my_func
是您要调用的函数。替换为您想要的。这就是我正在做的,
my_func
是我的function@lubik哎呀,该函数不可用。我用更新了我的答案。谢谢,效果很好。我有另一个输入错误,在超时命令的末尾加上了双引号。然而,我需要点击输入终端返回到主shell,因为子shell将显示其输出,直到它们超时为止。这会自动工作吗?例如在詹金斯。