如何使用定时全局变量影响 bash while 循环?
How to influence a bash while loop with a timed global variable?
我在 bash
脚本中有一个 while
循环,它应该在开始时和每 5 秒间隔做一些不同的事情。允许完成任何先前的循环。 5s间隔由heartbeat
函数设置的do_different
全局变量表示。另一个复杂的问题是正常的 while
循环会在未知的时间内完成(在下面的脚本中使用 RANDOM
进行了简化)。
使用 cron
不是一个选项,随机过程的时间也不是。
我已经尝试使用管道和进程替换,但均未成功。
整个脚本可能会被重构。
#!/bin/bash
function heartbeat {
do_different=true
while sleep 5s
do
do_different=true
done
}
heartbeat &
while true
do
if $do_different
then
echo 'Something different'
do_different=false
i=0
else
# process of random duration; not important
r=$(( 1 + RANDOM % 3 ))
sleep "${r}s"
i=$((i + r))
echo "$i"
fi
done
问题是 while
循环是在一个新的子 shell 中执行的,它有自己的全局变量副本。
有很多possible workarounds。将所有命令分组到子 shell 中对我有用。
#!/bin/bash
t_lastdue=$(date --date='5seconds ago' +%s)
while true
do
t_now=$(date +%s)
t_elapsed=$((t_now - t_lastdue))
if [ $t_elapsed -ge 5 ]
then
echo 'Something different'
t_lastdue=$((t_lastdue + 5))
i=0
else
# process of random duration; not important
r=$(( 1 + RANDOM % 3 ))
sleep "${r}s"
i=$((i + r))
echo "$i"
fi
done
我在 bash
脚本中有一个 while
循环,它应该在开始时和每 5 秒间隔做一些不同的事情。允许完成任何先前的循环。 5s间隔由heartbeat
函数设置的do_different
全局变量表示。另一个复杂的问题是正常的 while
循环会在未知的时间内完成(在下面的脚本中使用 RANDOM
进行了简化)。
使用 cron
不是一个选项,随机过程的时间也不是。
我已经尝试使用管道和进程替换,但均未成功。 整个脚本可能会被重构。
#!/bin/bash
function heartbeat {
do_different=true
while sleep 5s
do
do_different=true
done
}
heartbeat &
while true
do
if $do_different
then
echo 'Something different'
do_different=false
i=0
else
# process of random duration; not important
r=$(( 1 + RANDOM % 3 ))
sleep "${r}s"
i=$((i + r))
echo "$i"
fi
done
问题是 while
循环是在一个新的子 shell 中执行的,它有自己的全局变量副本。
有很多possible workarounds。将所有命令分组到子 shell 中对我有用。
#!/bin/bash
t_lastdue=$(date --date='5seconds ago' +%s)
while true
do
t_now=$(date +%s)
t_elapsed=$((t_now - t_lastdue))
if [ $t_elapsed -ge 5 ]
then
echo 'Something different'
t_lastdue=$((t_lastdue + 5))
i=0
else
# process of random duration; not important
r=$(( 1 + RANDOM % 3 ))
sleep "${r}s"
i=$((i + r))
echo "$i"
fi
done