2012-04-23 15 views
2

誰かが私にこれを手伝ってくれることを願っていました 15秒間ループ内にあるものを実行するシェルスクリプトのループが必要です。たとえば、bash - 設定されたタイムアウト後にサブプロセスを終了する

if (true) 
    run command for 15 seconds 
fi 
    kill PID 

私はシェルスクリプトには新しいので、私はこれで迷っています。 はまた、私はそれが何の違い

を行った場合、任意のヘルプは

+0

[バッシュのhttp://stackoverflow.com/questions/526782/how-do-i-limit-the-running-time-of-a-bash-script/526815#526815 – paxdiablo

+1

が重複する可能性を参照してください。与えられたタイムアウト後に子プロセスを殺すスクリプト](http://stackoverflow.com/questions/5161193/bash-script-that-kills-a-child-process-after-a-given-timeout) –

答えて

3

を高く評価しているDebianのinstllを使用していますがtimeoutコマンドをお探しですか?

+0

私は使ってみましたそれは動作しませんが、私はまた、ping -c 15 127.0.0.1 – AlanF

+0

'timeout 15 command'を使って試しましたか? – huon

+0

@AlanF:あなたはpingについて話していますか? 'ping -w1 -c15 127.0.0.1'を試しましたか?あるいは単にpingを実行していますか? –

0

次のbashスクリプトが役立ちます。スクリプトは、ループを開始する前に変数として初期エポック時間を設定します。ループが実行されている間、追加の変数は現在のエポック時間で設定されます。どちらのエポックタイムも比較され、差が15以下であれば、コマンドは引き続き実行されます。以下のスクリプトでは、現在実行中のコマンドは$ {COUNTER} "を数えるエコーであることに注意してください。あなたが達成しようとしているものと一致するようにスクリプトのこの部分を変更する必要があります。 2つのエポック時間の差が15を超えると、スクリプトは終了します。この時点でkillコマンドを開始する必要があります。エラーが発生した場合は、 "YourLogFile"に "ERROR ... YourScript.sh failed"と表示されるはずです(ログファイルを希望するものに設定してください)。

注:このループ内で実行しようとするものは、 15秒以内に何度も何度も何度も走っています。以下のスクリプトをテストとして利用すると、echoコマンドが1秒間に50回以上実行されることがわかります。

#!/bin/bash 

LOOP="true" 
INITIAL_TIME=$(date "+%s") 

while [[ ${LOOP} == true ]]; do 

    CURRENT_TIME=$(date "+%s") 
    COUNTER=$(expr ${CURRENT_TIME} - ${INITIAL_TIME}) 

    if [[ ${COUNTER} -le "15" ]]; then 

     echo "counting ${COUNTER}" 
     # RUN YOUR COMMAND IN PLACE OF THE ABOVE echo COMMAND 

    elif [[ ${COUNTER} -gt "15" ]]; then 
     exit 0 
      #INITIATE YOUR KILL COMMAND IN PLACE OF OR BEFORE THE exit 
    else 
     echo "ERROR... YourScript.sh failed" >> /YourLogFile 
    fi 

done 
+0

$ {COUNTER} "を数える' echo "を置き換えるコマンドはブロックし、終了しません。遅い接続で長いビデオをダウンロードするとします。 –

関連する問題