私は、終了ステータスに基づいてポートが開いているかどうかを確認する必要があるウォッチドッグbashスクリプトを作成しようとしています。そうでなければ、デーモンを起動する必要があります。問題は、STDOUTとSTDERRをリダイレクトして情報を出力するスクリプトを避けることができないことです。
nc -zv 1.2.3.4 55 | grep " open " >/dev/null 2>&1
または
nc -zv 1.2.3.4 55 | grep " open " 2>&1 >/dev/null
または
nc -zv 1.2.3.4 55 | grep " open " &>/dev/null
とにかく戻る
'FQDN_hostname_or_domainname [1.2.3.4] 55 (?) open'
それにもかかわらず、このコンボは、netstat
などの他のコマンドと連携します。それはnetcatに関するものですか、それともbash構文に関するものですか?何がおかしいのか教えてください。
この問題は、nc
またはnetcat
またはそれらの同類とは関係ありません。ここでは、nc
とgrep
の2つのコマンドを実行していますが、grep
の出力のみをリダイレクトしています。あなたがしたいことは:
nc -zv 1.2.3.4 55 &>/dev/null
もちろん、出力がなければgrep
はできないので、それは無意味です。それがgrepの-q
フラグの目的です:
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit
immediately with zero status if any match is found, even if an
error was detected. Also see the -s or --no-messages option.
だから、あなたが求めているのは次のようなものです:
nc -zv 1.2.3.4 55 2>/dev/null | grep -q " open " && start_daemon
または、stderrも解析する必要がある場合は、次のようにします。
nc -zv 1.2.3.4 55 |& grep -q " open " && start_daemon
-vオプションなしで実行中に、netcatのncの終了ステータスを使用してスクリプトを適切に実行することができました。とにかく、netcatのnetcatの出力はgrepにパイプされないようです。何らかの分岐によって引き起こされたのではないかと思います。
更新:
Terdonが彼の答えへのコメントで述べたように、nc
/netcat
からの出力の一部はstderrに、一部はstoutに出力されます。したがって、grepにパイプする前にこれらの2つのファイルをマージすると、トリックが行われます。
netcat -zvw1 1.2.3.4 55 2>&1 | grep "open"