2017-09-14 9 views
0

私はあなたがうまくいっていることを願っています!私はディレクトリにデータが入力されるまでディレクトリを頻繁にポーリングしようとしています。終了すると、linux環境のbashスクリプトを使ってディレクトリ上で次のタスクを実行したいのです。私はinotify-toolsにアクセスすることはできません。私はこのプロセスをテストしてい方法は1つのシェルコマンドラインに次のように入力して、次のとおりです。Linux環境でBASHスクリプトで次のコマンドを実行するwhileループを残す

while true; do touch /home/tmp/fun_temp/nothing.txt; sleep 10; rm -rf /home/tmp/fun_temp/nothing.txt; done 

これはnothing.txtと呼ばれる一時ディレクトリにファイルを作成し、10秒スリープして、それを削除し、その後、それをしません私がそれを止めるように言うまで、再び。私のbashスクリプトはディレクトリを20秒間隔で監視し、20秒でディレクトリ情報をold_stat.txtというファイルに書き込みます。それから20秒後、new_statと古いstatを比較し、等しい場合はループを終了してコマンドの次の部分を実行し、ポーリングを保持していない場合は実行します。ここに私のbashスクリプトがあります:

#!/bin/bash 
DIR_TO_CHECK='/home/tmp/fun_temp/' 
OLD_STAT_FILE='/home/sleep_files/old_stat.txt' 

if [ -e $OLD_STAT_FILE ]; then 
    OLD_STAT=`cat $OLD_STAT_FILE` 
else 
    OLD_STAT="nothing" 
fi 

NEW_STAT=`stat -t $DIR_TO_CHECK` 

while true; do 
    if [ "$OLD_STAT" != "$NEW_STAT" ]; then 
     echo 'Directory is still updating.' 
     sleep 20 
     echo $NEW_STAT > $OLD_STAT_FILE 
     echo 'Checking again.' 
    elif [ "$OLD_STAT" == "$NEW_STAT" ]; then 
     echo 'Directory is done updating. Move on.' 
     exit 0 
    fi 
done 

私は現時点でチェックとして出口0を使用しています。上記のwhileループをコマンドラインで実行し、次に別のシェルでこのbashスクリプトを実行してから、ディレクトリが変更されたことを確認してから、whileループをkillしますbashスクリプトをもう一度実行させますが、スクリプトを終了してもう一度実行しない限り、それは決して2番目の条件に変わり、ループを去りません。どんな助けも素晴らしいだろう、ありがとう!

+0

、スクリプトは/ fun_tmp'' /ホーム/ tmpのを確認しています。 – Barmar

+0

@Barmarこれは私のスクリプトでは正しいですが、これを書いたときの私の見落としでした。 –

+1

シェルスクリプトをデバッグする最も良い方法は、 'set -x'を最初に置くことです。実行された各コマンドが表示され、変数が展開されます。 – Barmar

答えて

0

スクリプトのこのバリアントを試してください:あなたのループは/ tmp`ディレクトリ `/ホーム/ MYHOMEを変更している

#!/bin/bash 
DIR_TO_CHECK='/home/tmp/fun_temp/' 
OLD_STAT="initial" 

while true; do 
    NEW_STAT=`stat -t $DIR_TO_CHECK` 
    if [ "$OLD_STAT" != "$NEW_STAT" ]; then 
     echo 'Directory is still updating.' 
     sleep 20 
     OLD_STAT=$NEW_STAT 
     echo 'Checking again.' 
    elif [ "$OLD_STAT" == "$NEW_STAT" ]; then 
     echo 'Directory is done updating. Move on.' 
     exit 0 
    fi 
done 
+0

は、魅力のように働きました、感謝の凍りつき。私はちょうどOLD_STAT = $ NEW_STATで提案したものを試しましたが、ループの外に最初のNEW_STATを残してしまい、動作しませんでした。今、私は分かる!ありがとうございました。 –

+0

この解決策をご理解いただき誠にありがとうございます。どういたしまして! :) – MrCryo

関連する問題