bash構文 - Terraformを使用してタイムアウト文字列が見つかるまで、sudo :: tailログでコマンドをラップします。

bash構文 - Terraformを使用してタイムアウト文字列が見つかるまで、sudo :: tailログでコマンドをラップします。

ターゲット:sudoを使用して文字列が見つかるまで、ログの後にあるcmd行を実行してから0で終了します。指定されたタイムアウト内に文字列が見つからない場合は、ゼロ以外の値で終了します。

解決策1を試しました。最初は要件としてタイムアウトがなかったので、いくつかの調査の最後に以下を使用することにしました。

sudo sh -c '( tail -n1 -f /path/to/nameOfLog.log & ) | grep -q "Started .*Application"'

しかし、今はタイムアウト要件があります。私が見つかるまで、このコマンドを使用するためにタイムアウトを取得する方法がわかりませんでした。Ondra Žižkaの返信。だから私の新しいコマンドは次のようになります。

解決策2を試してください。

timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)

しかし、これは明らかにsudo権限を使用していません。私が試したいくつかの失敗したバリエーションは次のとおりです。

1を試してください:(cmdの前にsudoを追加)

sudo timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)

出力:

grep: /dev/fd/63: No such file or directory

2回試してください:(サブシェルにcmdをラップしてみてください)

sudo sh -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'

出力:

sh: 1: Syntax error: "(" unexpected

sudoを使用してこのコマンドを実行できるように、誰かが私に問題と解決策を示し、説明できますか?そして本当に始めるべきことがあります。試した解決策1残業をさせてもらえますか?

ベストアンサー1

1)ここでサブシェル(または背景)が役に立つかどうかわかりません。

sudo sh -c '( tail -n1 -f /path/to/nameOfLog.log & ) | grep -q "Started .*Application"'

単純なパイプラインは機能しないのですか?

sudo sh -c 'tail -n1 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'

2)「1回試み」:

sudo timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)

<()拡張入力リダイレクトはコマンドラインで実行さsudoれず、開いているsudoファイルハンドルが渡されないため、擬似sudoファイルを開くことはできません。grepgrep/dev/fd/63

ここの背景も同様なtailので不要です。


3)そして、PHKコメント、「2回試してください」:

sudo sh -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'

...他の機能的なシェルのsh代わりに明示的に実行されます。bash共通標準shはサポートされておらず、<()DebianやUbuntuでもdash使用されていません。sh

代わりに、これを実行すると、Ubuntuに存在できるログインシェルがsu実行されます。しかし、両方を使用することは重複しています。それ以降は、どちらも権限を拡大するように設計されています。rootbashsudosusudo すでに高い特権で実行中です。したがって、必要ありませんsu。代わりに内部でシェルを実行するには、次のsudoいずれかを指定します。

sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'

おすすめ記事