リモートでタスクを開始できるコマンドラインインターフェイスを持つCIサーバーがあります(jenkins
CIサーバーとjenkins-cli.jar
ツール)。
作業を開始したら、tail -f
以下を記録します(コマンドが混乱して申し訳ありません)。
ssh -t my-jenkins-host.com "tail -f \"/var/lib/jenkins/jobs/$job_name/builds/\`ls -ltr /var/lib/jenkins/jobs/$job_name/builds/ | grep '^l' | tail -n 1|awk '{print \$9}'\`/log\""
ジョブが正常に完了すると(通常少なくとも5分)、出力に次の行が表示されます。
Finished: SUCCESS
この時点でログテーリングを停止する良い方法はありますか?同様のコマンドがありますかtail_until 'some line' my-file.log
?
ボーナス:SUCCESSが一致した場合は0を返し、FAILUREが一致した場合は1を返す答えを提供でき、ソリューションがMacで動作する場合! (私はそれがbsdベースであると信じています)
答え1
tail -f
にパイプを接続しsed
て検索中の行を見つけたら、終了するように指示できます。
tail -f /path/to/file.log | sed '/^Finished: SUCCESS$/ q'
sed
デフォルトでは、処理するすべての行を印刷し、その行を見ると終了します。tail
次の行を書き込もうとすると、出力パイプが破損していることが判明した場合、プロセスは停止します。
答え2
tail -f my-file.log | grep -qx "Finished: SUCCESS"
-q
、静かなことを意味し、一致するものが見つかったら終了します。
-x
grep
ライン全体を一致させます。
2番目の部分では、以下を試してください。
tail -f my-file.log | grep -m 1 "^Finished: " | grep -q "SUCCESS$"
-m <number>
grepに次の後に停止するように指示する数字マッチ
grep -q
終了ステータスが行末で見つかった場合にのみ適用されます。0
SUCCESS
すべての出力を表示したい場合は使用できませんが、grep -q
これを行うことはできます。
tail -f my-file.log | grep -m 1 "^Finished: "
存在する場合は、終了ステータスを1に設定することをFAILURE
除くすべての操作を実行します。
答え3
私はここにある答えが気に入らず、自分で始めることにしました。このbashスクリプトはすべての基準を満たし、失敗時に1を終了する報酬を含みます。
#!/bin/bash
while IFS= read -r LOGLINE || [[ -n "$LOGLINE" ]]; do
printf '%s\n' "$LOGLINE"
[[ "${LOGLINE}" == "Finished: SUCCESS" ]] && exit 0
[[ "${LOGLINE}" == "Finished: FAILURE" ]] && exit 1
done < <(timeout 300 tail -f my-file.log)
exit 3
また、終了コード3が発生するタイムアウト機能も含まれています。システムにタイムアウトコマンドがない場合は、Anthony Thyssenからtimeout.shスクリプトを取得します。
https://antofthy.gitlab.io/software/(「タイムアウト:」検索)
以下の説明に基づいて、エスケープ文字の拡張を停止し、標準の「読み取り」のすべての機能を含むようにログ印刷を更新しました。バラよりhttps://stackoverflow.com/a/10929511完全な「読み取り」の詳細を表示するには。ここではEOF検証は必要ありませんが、完全性のために含まれています。
答え4
あなたも試してみることができます
grep -q 'App Started' <(tail -f /var/log/app/app.log)