2016-11-10 17 views
0

私はbashスクリプトを学習しており、x秒間に5秒ごとに関数を呼び出す必要があります。 xは、スクリプトの実行時にコマンドライン引数によって決定されます。私は腕時計を試しましたが、それは永遠に続くようですが、私はx秒後に復帰する能力を持っていないようです。寝る道があるかもしれないが、それは不器用に思われ、私は地元のドリフトに対処しなければならない。エレガントなソリューションはありますか?シェルx秒間に5秒ごとにコマンドを実行するスクリプト

マイコード:

#!/bin/bash 

if [ $# -ne 1 ]; then # only 1 command line arg allowed 
    echo "Incorrect arguments" 
    exit 1 
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit 
    echo "Argument must be a positive number" 
    exit 1 
fi 

ask() 
{ 
    OUTPUT=$(snmpwalk -v2c -c community server oib) 
    CLEANOUTPUT="${OUTPUT:32}%" 
    echo $CLEANOUTPUT 
} 

#export -f ask 
#watch -n5 ask 

答えて

2

bashを開始してからSECONDS変数は秒数をカウントします。

#!/bin/bash 

while ((SECONDS <= 20)) 
do 
    echo "Running something" 
    sleep 5 || break 
done 
echo "Done" 

この単純な方法は、でしょうsleep 5最後に実行した後も、あなたが知っています20秒以上経過し、コマンドの実行時間を考慮しません(コマンドが2秒間実行されると、起動することになります)。毎秒7秒)。あなたはもう少し正確なタイミングを持つようにしたい場合は

+0

ヒントをありがとうセコンド –

+0

なぜ 'sleep 5 ||休憩? 0を返すのをスリープしないので、ブレークは決して呼び出されませんか?それが呼び出されたとしても、 'done'の直前に何をしますか? –

+0

'sleep'は、現在のプラットフォームがGNUの' 0.5'や '1m'のように無効と見なす時間指定子で殺されたり中断されたり、呼び出されたりしたときに0以外の値を返すか、何らかの理由 –

0
#!/bin/bash 
if [ $# -ne 1 ]; then # only 1 command line arg allowed 
    echo "Incorrect arguments" 
    exit 1 
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit 
    echo "Argument must be a positive number" 
    exit 1 
fi 

iterations=$(($1/5)) 
for i in $(seq 1 $iterations); 
do 
     OUTPUT=$(snmpwalk -v2c -c community server oib) 
     CLEANOUTPUT="${OUTPUT:32}%" 
     echo $CLEANOUTPUT 
     sleep 5 
done  
+0

(私はちょうど私が、私はそれを行うだろうどのようにお見せしようと思いました、睡眠が推奨されていません知っている)申し訳ありません – UltrasoundJelly

+0

何かのようにx回の回数は、x秒間実行したかったのです。コマンドラインで20インチを置くと、20秒間実行され、5秒ごとに出力されるので、4つの出力が得られます。 –

+0

私の答えが修正されました。私が知る限り、一定の回数繰り返した後に時計が停止することはありません。 – UltrasoundJelly

1

は、あなたがしてsleep終了するまでフォアグラウンド処理を停止しますwaitを使用し、必要とされるすべての作業を行い、バックグラウンドにsleepを置くことができます。精度は完璧ではありませんが、少なくとも作業部分の所要時間は含まれていません。私はそれを実行したくなかった

#!/bin/bash 

LOOPTIMES=3 
REPEATEVERY=5 # seconds 

for ((count=0 ; $count < $LOOPTIMES ; count++)) 
do 
    /bin/sleep $REPEATEVERY & 

    echo "Doing work $count..." 
    # do whatever 

    wait # this will wait until the sleep exits 
done 

終了0

関連する問題