web-dev-qa-db-ja.com

ncのSTDOUTおよびSTDERRリダイレクト

私は、終了ステータスに基づいてポートが開いているかどうかを確認する必要があるウォッチドッグ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構文に関するものですか?何がおかしいのか教えてください。

3

この問題は、ncまたはnetcatまたはそれらの同類とは関係ありません。ここでは、ncgrepの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
5
terdon

-vオプションなしで実行中に、netcatのncの終了ステータスを使用してスクリプトを適切に実行することができました。とにかく、netcatのnetcatの出力はgrepにパイプされないようです。何らかの分岐によって引き起こされたのではないかと思います。

更新:

Terdonが彼の答えへのコメントで述べたように、nc/netcatからの出力の一部はstderrに、一部はstoutに出力されます。したがって、grepにパイプする前にこれらの2つのファイルをマージすると、トリックが行われます。

netcat -zvw1 1.2.3.4 55 2>&1 | grep "open"

1