运行一段时间后,Bash 脚本不会在后台保持打开状态

运行一段时间后,Bash 脚本不会在后台保持打开状态

从 NC 收到第一条消息后,我无法让以下 bash 脚本保持打开状态:

#!/bin/bash
port=3333
nc -l $port | while read msg; do notify-send Alert "$msg"; done

收到第一条消息后,它就退出了。我希望它保持打开状态并继续监视来自 NC 的新消息。

我知道如果我nc -l port在不使用 while 循环的情况下启动它,它将保持打开状态,并且我可以在两个连接之间聊天,甚至断开与连接主机的连接。

我使用以下方式发送消息:

echo 'done' | nc IP port

答案1

只需向 nc 添加 -k 选项即可。如下所示:

nc -l $port -k | while read msg; do notify-send Alert "$msg"; done

如图所示man nc

-k 强制 nc 在当前连接完成后继续监听另一个连接。如果未使用 -l 选项使用此选项,则会出现错误。

答案2

您应该使用-k选项。nc -lk 3333

正如所述man nc

 -k      Forces nc to stay listening for another connection after its current
         connection is completed.  It is an error to use this option without the
         -l option.

编辑:
请注意,我和我的同志在这里几乎同时发布了相同的答案。(就像那个人的想法:)) – 为了不完全冗余,我添加了一个同时使用-k和不使用的样本。

第一的:

我知道如果我启动 nc -l port 而不使用 while 循环,它会保持打开状态,我可以在两个连接之间聊天,甚至断开与连接主机的连接。

我的情况不是这样。它只会显示一条消息,然后关闭。

第二:

我想说-k,因为它与软件捆绑在一起并且运行良好,所以是最好的方法。但是,也可以将其包装在永恒循环中。

用来-v获取更多信息。

#!/bin/bash

nc1()
{
    nc -lkv $port | 
    while read msg; do 
        if [[ "$msg" =~ ^(q|quit|x|exit|halt)$ ]]; then
            printf ";; Received shut down signal \`%s'\n" "$msg"
            # Hack to terminate
            printf "\n" | nc localhost $port &
            break
        fi

        printf "MSG: %s\n" "$msg"
    done
}

nc2()
{
    while true; do
        msg=$(nc -lv $port)
        if [[ "$msg" =~ ^(q|quit|x|exit|halt)$ ]]; then
            printf ";; Received shut down signal \`%s'\n" "$msg"
            break
        fi

        printf "MSG: %s\n" "$msg"
    done
}

port=3333
fun=nc1

while [[ "$1" ]]; do
    case "$1" in
    1) fun=nc1;;
    2) fun=nc2;;
    p) port="$2"; shift;;
    *) printf "Unknown option \`%s'\n" "$1"
    esac
    shift
done

$fun

在另一个会话中:

printf "hello.\nHow are you?\n" | nc localhost 3333; sleep 1; printf "Good bye.\n" | nc localhost 3333; sleep 1; printf "x\n" | nc localhost 3333

有点超出问题的范围;但在某些情况下可能是相关的:如果您使用一些转储工具,sudo tcpdump -i lo -vvv -w nc.cap您会注意到您得到的是:

消息“你好。\n你好吗?\n”:

1. TCP-connection; three-way handshake:

Client send     SYN
Server responds SYN, ACK
Client responds ACK

2. DATA

Client send     ACK, PUSH + message
Server responds ACK

3. TCP-termination; three-way handshake:

Client send     ACK, FIN
Server responds ACK, FIN
Client send     ACK

相关内容