我希望每2秒执行一次命令,并在while循环中每5秒执行一次命令。
start
while [ 1 ]
do
if [ time diff == 2]
do sth
fi
if [ time diff == 5]
do sth else
fi
end
dif = end - start
但是当差异为0时,这是一个小问题。 我怎样才能在shell脚本中做到这一点?
答案 0 :(得分:5)
试试这个:
while true; do sth ; sleep 2 ; done
您可以使用子shell:
#!/bin/bash
(while true ; do echo time2 ; sleep 2 ; done)&
(while true ; do echo time5 ; sleep 5 ; done)
但是,您将不得不做一些事情来杀死后面的子shell。
答案 1 :(得分:0)
尝试sleep
while true
do
..
sleep 2
done
答案 2 :(得分:0)
可能最简单的方法是像这样的10秒循环! (因为10是2和5的最小公分)
while true
do
sth
sleep 2
sth
sleep 1
sth else
sleep 1
sth
sleep 2
sth
sleep 2
sth
sth else
sleep 2
done
虽然有点疯狂!
当然,这假设命令是即时的,您可能希望使用&
答案 3 :(得分:0)
#!/bin/bash
#
rhythm () {
beat1=$1
beat2=$2
tick=0
while [ 1 ]
do
(( tick % $beat1)) || echo a
(( tick % $beat2)) || echo b
tick=$(((tick+1)%(beat1*beat2)))
sleep 1
done
}
rhythm 2 5
当然,这只适用于2个参数,如果示例中的echo消耗的时间/真实命令中的实际命令是无关紧要的。
答案 4 :(得分:0)
如果您想要非常彻底,可以将此作为起点
#!/bin/bash
declare -a JOBPIDS
function repeatbackground()
{
local delay="$1"
shift
(
while true
do
sleep "$delay" || return 0 # abort on sleep interrupted
eval "$@"
done
)&
JOBPIDS=( ${JOBPIDS[@]-} $! )
}
function signalbackgroundtasks()
{
for bgpid in "${JOBPIDS[@]}"
do
kill -TERM "$bgpid" || echo "Job $bgpid already vanished"
done
JOBPIDS=( )
}
trap "signalbackgroundtasks; exit 0" EXIT
repeatbackground 2 echo "by the other way"
repeatbackground 5 echo the other background job
echo "Running background jobs ${JOBPIDS[@]}"
wait
exit 0
答案 5 :(得分:0)
以下内容不使用特定于bash的功能或子shell,并且很容易概括:
set 1 2 3 4 5
while :; do
sleep 1
shift
case $1 in
2|4) echo "every 2 seconds" ;;
5) echo "every 5 seconds" ; set 1 2 3 4 5 ;;
esac
done