如果 bash 循環在 x 秒內運行 x 次,如何強制它結束?

如果 bash 循環在 x 秒內運行 x 次,如何強制它結束?

我正在嘗試透過 ssh 從遠端管道獲取批量輸入。我下面的腳本工作正常,但我想在其中添加某種檢查,以便如果出現問題或打破循環,如果腳本開始運行,循環就會結束。

如何新增一個元件來檢查循環是否運行,例如 3 秒內運行 5 次,然後腳本將中斷循環並自動終止?

#!/bin/sh
if [ -z "$1" ]
    then
    echo " usage: user@host"
    echo
    exit
fi


while [ 1 ]
    do
    CB=`ssh $1 cat clipboardpipe`
    if [ -n "$CB" ]
        then
        echo $CB | /usr/bin/pbcopy
        echo $CB | /usr/local/bin/growlnotify
    fi
    sleep 1
done

ps:我曾考慮過使用類似的東西tail -f,但當其他程式需要批次輸入時,它似乎不起作用。歡迎所有建議。

pss:clipboardpipe是遠端系統主目錄中的命名管道。

答案1

GNUdate通過%N.

every=3     # test every n'th itteration 
bsecs=0.95  # break at secs (float)
bnano=$(printf '%0.9f' "$bsecs"); bnano=${bnano/./};  
# avoid lead '0' octal clash when time slice < 1 sec
shopt -s extglob; bnano=${bnano#+(0)}  

tprev=$(date +%s%N)
for i in {1..24} ;do  # just a test loop

  if ((i%every==1)) ;then
    tnow=$(date +%s%N)
    if ((tnow-tprev>=bnano)) ;then 
        echo "Auto Break!  $every itteratons took longer than $bsecs secs"
        break
    fi
    ((tprev=tnow))
  fi
  # do something, eg sleep for testing
  sleep 1.$i; echo $i
done

答案2

如果您使用的是 Linux,則可以使用暫停coreutils 包提供的命令。

逾時文檔

相關內容