ターゲット: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 &)'
答え2
確立されたAlexander Batyshevの返信使用sudo su -c
。
ソリューション(以前):
sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'
修正する:
に基づいてイルカチュウの答えもう少しテストし、新しい解決策を見つけました。
まず、イルカチュウ
sudo su
冗長性に関する質問に答えてください。sudo
コマンドからそれを削除すると、パスワードの入力を求められます。2. ターゲティングイルカチュウサブシェルが役に立たないという質問に答えます。これは本当です。ただし、サブシェルを持たないコマンドは、何らかの理由でログがアクティブに記録された場合にのみ返されます。それ以外の場合は中断されます。サブシェルを使用すると、ログがアクティブに記録されない場合でもcmdが返されます。だから私はsubshelコマンドを好みますが、
sh
subshelはサポートされていません。また、アクティビティログでテストするときに使用時
bash
と使用時がsh
異なることを発見しました。何らかの理由でsh
反応するのにさらに1秒かかりますbash
。この2つの理由(subshellの使用と遅延
sh
)は、これが適切な解決策であるとはbash
思わない。sh
3. 対象イルカチュウ不要な&の答えです
tail
。はい、削除しました。何の効果もありません。
要約:
sudo su vs su
//prompts for password w/out sudo
su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)''
//works
sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
sh -cを使う
//either works (sudo or not using sudo)
//but both won't work unless log is actively being written to for some reason
sudo sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'
sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'
バッシュを使って
//either works (sudo or not using sudo)
sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
新しいソリューション:
私は一つを見逃していることに気づいた重要詳細。これは次のように行われます。Terraform リモート実行構成プログラム。 Terraformは、すべての場合に対してサーバーの/ tmp /の下にローカルの.shスクリプトを生成します。待ち行列注文する。これコミュニケーター/ssh/communicator.go#!/bin/sh
これはスクリプトの上部に設定されていることを意味しますsh
。したがって、サブシェルを使用しているので、bashを使用する必要があります。 sudoを使用する必要はありません。これは私の誤解でした。しかし、まだsudoを使用できます。だから私の答えはバッシュを使って上記の「要約」の下にリストされているコマンドです。
ポリスチレンこの場合、私のターゲットサーバーは実行中です。14.04.1 - Ubuntu。ls -l /bin/sh
プログラムを実行するので、/bin/sh -> dash
実際にはダッシュ以外には使用しませんでしたsh
。それで、それdash
も同じようなイライラを持っているようですsh
。