ターゲット: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
ファイルを開くことはできません。grep
grep
/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
実行されます。しかし、両方を使用することは重複しています。それ以降は、どちらも権限を拡大するように設計されています。root
bash
sudo
su
sudo
すでに高い特権で実行中です。したがって、必要ありませんsu
。代わりに内部でシェルを実行するには、次のsudo
いずれかを指定します。
sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'