存在する場合にのみ、txtファイルに特定の変更を加えるシェルスクリプトを作成していますが、このテストループは機能しません。なぜでしょうか。ありがとうございました!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
存在する場合にのみ、txtファイルに特定の変更を加えるシェルスクリプトを作成していますが、このテストループは機能しません。なぜでしょうか。ありがとうございました!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
回答:
「動作しない」と言ったとき、動作しないことをどうやって確認しますか?
次の行を追加して、ファイルが実際に存在するかどうかを調べてみてください。
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
'echo $ SHELL'と入力して、Bash(または関連)シェルを使用していることを確認することもできます。CSHとTCSHは、このループに少し異なるセマンティクスを使用していると思います。
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Linuxを使用していて、inotify-toolsがインストールされている場合は、次のようにできます。
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
これにより、「x」秒ごとにポーリングしながら、スリープによって生じる遅延が減少します。必要になると予想される場合は、さらにイベントを追加できます。
--exclude
ファイル名を除外する必要がありますが、ファイル名以外の--include
すべてを無視するわけではありません。上記のコマンドは、-qq
代わりに引数を使用する必要が>&/dev/null
あります。
--timeout
チェックの頻度ではなく、ですか?inotifywaitのポイントは、投票がないことです
inotifywait
ないと、イベントのリスニングを開始する直前にファイルが作成された場合、無期限にハングする可能性があります。
私は同様の問題に遭遇し、それが私をここに導きました、それで私は同じことを経験する人のために私の解決策を残したいと思いました。
実行しcat /tmp/list.txt
た場合、ファイルにコンテンツがすぐに配置されていることが確認されていても、ファイルが空であることがわかりました。それが期待どおりに機能するsleep 1;
直前に私が置いた場合、判明しましたcat /tmp/list.txt
。ファイルが作成されてから書き込まれるまでの時間、またはこれらの行に沿った何かの間に遅延があったに違いありません。
私の最後のコード:
while [ ! -f /tmp/list.txt ];
do
sleep 1;
done;
sleep 1;
cat /tmp/list.txt;
これが誰かをイライラする30分救うのに役立つことを願っています!
@ zane-hooperと同様に、NFSでも同様の問題が発生しました。並列/分散ファイルシステムでは、1つのマシンでファイルを作成してから、それを「見る」別のマシンでのラグが非常に大きくなる可能性があるため、ファイルの作成後、whileループが終了するまで最大1分間待つことができます(そしてまた、既に削除されたファイルを「見る」ことによる後遺症もあります。
これにより、スクリプトが「機能しない」という幻想が生まれますが、実際には、ファイルシステムがボールを落としているのです。
これは私が理解するのにしばらくかかりました、それが誰かの時間を節約することを願っています。
PSこれはまた、不愉快な数の「古いファイルハンドラ」エラーを引き起こします。
bashとshの両方で動作します:
touch /tmp/testfile
sleep 10 && rm /tmp/testfile &
until ! [ -f /tmp/testfile ]
do
echo "testfile still exist..."
sleep 1
done
echo "now testfile is deleted.."
ここにタイムアウトのあるバージョンがあるので、しばらくするとループがエラーで終了します。
# After 60 seconds the loop will exit
timeout=60
while [ ! -f /tmp/list.txt ];
do
# When the timeout is equal to zero, show an error and leave the loop.
if [ "$timeout" == 0 ]; then
echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
exit 1
fi
sleep 1
# Decrease the timeout of one
((timeout--))
done
このようにしてください
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt