等待多个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且不增加
#/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
启动的新shell中可见,如下所示李>timeout
#/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
启动的新shell中可见,如下所示李>timeout
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”:没有这样的文件或目录
@lubikmy_func
是您要调用的函数。替换为您想要的。这就是我正在做的,my_func
是我的function@lubik哎呀,该函数不可用。我用更新了我的答案。谢谢,效果很好。我有另一个输入错误,在超时命令的末尾加上了双引号。然而,我需要点击输入终端返回到主shell,因为子shell将显示其输出,直到它们超时为止。这会自动工作吗?例如,在Jenkins.I获得timeout:无法运行命令'my_func':没有这样的文件或目录
@lubikmy_func
是您要调用的函数。替换为您想要的。这就是我正在做的,my_func
是我的function@lubik哎呀,该函数不可用。我用更新了我的答案。谢谢,效果很好。我有另一个输入错误,在超时命令的末尾加上了双引号。然而,我需要点击输入终端返回到主shell,因为子shell将显示其输出,直到它们超时为止。这会自动工作吗?例如在詹金斯。