我正在尝试制作一个看门狗 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 语法有关?请告诉我我哪里做错了。
答案1
nc
这个问题与 或netcat
或任何同类命令都无关。您在这里运行两个命令,nc
和grep
,但只重定向 的输出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
答案2
在没有 -v 选项的情况下,使用 netcat 的 nc 退出状态成功让脚本正常运行。无论如何,似乎 netcat 的输出没有被传送到 grep。我猜这可能是由某种分叉引起的。
更新:
正如 terdon 在他的回答的评论中提到的那样,nc
/的输出部分netcat
打印到 stderr,部分打印到 stout。因此,在管道传输到 grep 之前合并这两个文件可以解决问题:
netcat -zvw1 1.2.3.4 55 2>&1 | grep "open"