Скрипт Bash не будет оставаться открытым в фоновом режиме после запуска

Я не могу заставить следующий скрипт bash оставаться открытым после получения первого сообщения от NC:

#!/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
3
задан 13 December 2012 в 00:49

2 ответа

Просто добавьте опцию -k в nc. Например:

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

Как видно из man nc:

-k Принуждает nc продолжать прослушивать другое соединение после завершения его текущего соединения. , Ошибка использования этой опции без опции -l.

0
ответ дан 13 December 2012 в 00:49

Необходимо использовать -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 порт без цикла с условием продолжения, это остается открытым, и я могу болтать далеко между этими двумя соединениями, даже разъединяются от связанного хоста.

Дело обстоит не так для меня. Это закрывается после одного сообщения.

Во-вторых:

Я сказал бы -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 Вы заметите, что то, что Вы получаете:

Сообщение "привет \nHow является Вами? \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
3
ответ дан 13 December 2012 в 00:49

Другие вопросы по тегам:

Похожие вопросы: