Unixスクリプト - 特定のモードでは、tail -fを終了し、awkを使用して別々のスクリプトを実行する必要があります。

Unixスクリプト - 特定のモードでは、tail -fを終了し、awkを使用して別々のスクリプトを実行する必要があります。

したがって、アプリケーションが完全にロードされた後に/ tmpをクリーンアップするには、起動スクリプトを変更する必要があります。いくつかの調査の最後に、次のスクリプトコマンドを見つけました。

tail -f /home/user1/logs/application.log | awk '/Application is fully up and running/ { system("pm2 restart cleantmp"); exit 1; }'

echo "Startup complete"

デフォルトでは、「アプリケーションが完全に動作し、実行中」モードがあるかどうかスクリプトのすべての改行を確認し、そのような場合はpm2を使用してクリーンアッププロセスを再開します。

これは、アプリケーションの起動後に/ tmpをクリーンアップするようです。しかし、コンソールがそこで停止し、サーバー出力を表示し、絶対にシャットダウンしないという問題が発生します。エラーのため、失敗も失敗もしません。まったくechoステートメントに到達せずにCTRL + Cを使用するのを待ちます。

このサイトの調査に基づいて、tailとsedを使用して別のバージョンを試しました。

tail -f /home/user1/logs/application.log | grep --line-buffered -q 'Application is fully up and running' | while read ; do pm2 restart cleantmp ; done
tail -f /home/user1/logs/application.log | sed "/Application is fully up and running/q"

どちらの場合も、スクリプトはクリーンアップ操作も実行しません。 「ps -aux | grep tail」を使った追加テストでは、これは確かにtail -fスクリプトの完了を妨げていることがわかりました。同様のユースケースを持つ人はいますか?どんなアドバイスも本当にありがとうございます。

ベストアンサー1

そして

tail -f /home/user1/logs/application.log |
grep --line-buffered -q 'Application is fully up and running' |
while read ; do pm2 restart cleantmp ; done

-q出力を生成したくない場合は、Tellを使用してgrep目的の内容を読みたいループにパイプします。次のことを試すことができます。

tail -f /home/user1/logs/application.log |
grep --line-buffered -q -m 1 'Application is fully up and running'
pm2 restart cleantmp

ただし、尾は次の行が入力ファイルに書き込まれるまで終わりません。問題の説明ではそのようなことは起こらないと思うので、文字列を探すスクリプトで入力ファイルに空白行を書き換えることができます。そのスクリプトを終了しています。検索前:

file='/home/user1/logs/application.log'
tail -f "$file" |
awk -v file="$file" '/Application is fully up and running/{exit} END{print "" >> file}'
pm2 restart cleantmp

これは少しハッキング的ですが、入力ファイルに空白行を追加することを気にしない限り機能します。

結局のところ、最も簡単な解決策は、tail目的の文字列が表示されるまで無限ループで毎秒awkを忘れて呼び出してからループから抜け出すことです。

while :; do
    awk '/Application is fully up and running/{f=1; exit} END{exit !f}' && break
    sleep 1
done < '/home/user1/logs/application.log'
pm2 restart cleantmp

最後に探している最後のメッセージがログファイルに1行で記録されたとします。

おすすめ記事