【发布时间】:2020-08-15 23:35:09
【问题描述】:
有一个我在循环中并行调用的函数:
#!/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
我希望所有函数定期检查直到实体的状态正常,然后等待所有正常状态或在达到超时时停止所有(剩余)函数?无论什么都先到。以上似乎不起作用,我需要手动杀死它。
为什么我在最后得到
"Timeout reached"回显,而脚本没有等待函数完成?为什么
count=0在 my_func 中并没有增加?
【问题讨论】:
-
将您的脚本复制并粘贴到shellcheck.net 以查看您的错误,并阅读有关子shell 以了解您的逻辑为何不起作用。
-
睡眠循环的意义何在?它不检查任何东西,只是(在修复后)增加一个变量并再次休眠......另外,请查看timeout 命令?
-
@Keldorn 我想增加计数器,所以一旦达到超时,我可以设置运行函数的标志
-
注意
count=count+5不是很有用;它将字符串"count+5"分配给变量count。您可能想到了count=$(($count + 5))或主题的变体,例如((count += 5))。