ファイルが更新されていることを確認するスクリプトを作成しようとしています。その時点でファイルが更新された場合、スクリプトは何もしませんが、ファイルの更新が停止した場合、スクリプトはいくつかの追加ステートメントを返す必要があります。
これまで、次のスクリプトがあります。
#!/bin/bash
DIR=/home/
cd $DIR
FILE=$(find . -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)
while [ ${FILE} -eq 1 ]
do
echo "Now sleeping for 20 seconds"
sleep 20
done
if [ ${FILE} -eq 0 ]
then
echo "Job is finished"
fi
デフォルトでは、私のホームディレクトリから1分以内に更新されたtest.logというファイルを探しています。ファイルが存在することを示すために、wc -lを使用しています。 test.logファイルが存在する場合は、whileループを使用して「20秒間スリープモードに切り替える」という文を返したいと思います。ファイルが更新されなくなったら、スクリプトを続行して「作業完了」を返したいと思います。
このとき、test.logファイルがないときにスクリプトを実行すると、Job is doneが返されます。ただし、test.logファイルが存在し、「1分前」以下の場合、スクリプトは「現在20秒間待機中」を返し、ファイルが1分より古く更新されていない場合でもこの情報を返し続けます。これ以上。スクリプトは引き続き「タスク完了」を返しません。
答え1
ループ内で変数を変更しないのでFILE
(同じまま)、すぐに完了するか無限ループに入ります。
あなたのLinuxシステムにこのstat
コマンドがあるとし、次のことを試してください。
while (( ( $(printf "%(%s)T") - $(stat -c"%Y" test.log) ) < 60 ))
do echo "Now sleeping for 20 seconds"
sleep 20
done
2つの時間値を簡単に減算するために、合計とエポック形式bash
の機能を利用してください。ファイルが1分以内に変更されると、ファイルが1分より古いまで繰り返されます。%()T
((...))
stat
答え2
永久に繰り返されるwhileループとbreak
ファイルが見つからない場合は、ループを使用できます。find
冗長検査のためにループ内でコマンドを移動する必要があります。
#!/bin/bash
while true; do
logfile=$(find /home -maxdepth 1 -type f -mmin -1 -name 'test.log')
if [ -z "$logfile" ]; then
break # no file found, break while-loop
fi
echo "Now sleeping for 20 seconds"
sleep 20
done
echo "Job is finished"
答え3
FILE=$(find . -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)
find
割り当てが行われると、ここでコマンド置換が拡張されて開始されます。他は変更しないため、FILE
スクリプトの起動時に得られた値は保持されます。ループ内でコマンドの置き換えと割り当てを移動します。
答え4
@Freddyのソリューションを少し改善しました。
#!/bin/bash
while find /home -maxdepth 1 -type f -mmin -1 -name 'test.log' | grep -q .
do
echo "Now sleeping for 20 seconds"
sleep 20
done
echo "Job is finished"
このソリューションは、grep
s-q
スイッチを使用してgrepの一般的な出力(find
null / not-null条件テストの出力)を抑制します。コマンドが少なくとも1行のテキストを出力する限り、ループはwhile
繰り返されます。ファイルが1分より長くなると、find
出力が生成されなくなり、コマンドが失敗してループが終了します。test.log
find
grep