これは簡単なはずですが、何かが欠けていて助けが必要です。私の要件は、最新のログを取得するためにログファイルをフッターで読み、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 2
ifループではなぜ機能しないのですか?
パイプはサブシェルを開始し、コマンドは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.file
server.log
ログが記録されなくなり、プロセスが開いていることを示す場合、これは特に重要です。