条件が満たされても、while 読み込みループは壊れません。

条件が満たされても、while 読み込みループは壊れません。

これは簡単なはずですが、何かが欠けていて助けが必要です。私の要件は、最新のログを取得するためにログファイルをフッターで読み、grepを使用して設定をダウンロードし、すべてのファイルをコピーしてMyOwnLogFile.logに書き込むことです。しかし、.myworkisdoneファイルが/ usr / localに表示されたら、それを停止したいと思います。 /FOLDER / 1つの明確な点は、すべてのログが完了すると最後に.myworkisdoneが生成されることです。ただし、ファイルが生成されても、スクリプトはログファイルを読み続けて終了しません。

while [[ ! -e /usr/local/FOLDER/.myworkisdone ]];
do
    sudo tail -f -n0  /var/log/server22.log | while read line; do echo "$line" | grep -e 'Downloading Config’ -e ‘Copying all files of' ; done  >> /var/tmp/MyOwnLogFile.log
done

untilまた、whileの代わりにファイルをスキャンしようとしましたが、スクリプトはまだログファイルを読み取る魔法を破ることはできません。よろしくお願いします。

ベストアンサー1

@ikkachuが言ったように、tail -fこれは無限のプロセスです。ただし、内部ループを使用して割り込みを開始できます。

while :
do
    tail -f server.log | while IFS= read -r line
    do
        printf '%s\n' "$line" | grep 'word' >> ownlog.log
        if [ -e killer.file ] ; then break ; fi
    done
    break 
done
  • break 2ifループではなぜ機能しないのですか?

パイプはサブシェルを開始し、コマンドはbreakサブシェルを終了できません。だから、break外側のループに別のものがあります。

  • スクリプトはいつ停止しますか?

killer.file存在する場合、保留中のアイテムは| while read ...まだ別のアイテムを待って全体的に開いています。つまり、(ダミーファイルを使用して)次の行が必要です。

 echo test >> server.log
 #"normal" output - nothing happens

 echo word >> server.log
 #matching output - logged to ownlog.log
 
 touch killer.file
 #killer file appears - breaks cannot take effect
 #as "read" still awaits signal.

 echo test2 >> server.log
 #break takes effect

killer.fileserver.logログが記録されなくなり、プロセスが開いていることを示す場合、これは特に重要です。

おすすめ記事