Как слушать порт постоянно (bash+netcat+python)?

Доброго времени суток!
имеется bash скрипт

#!/bin/bash
    while :
        do
            nc -l -p 30003 | python3 script.py 
        done

я хочу, слушать с этого порта даные и отправлять на питон. причем, слушать хочу постоянно, т.е если было одно соединение и оно порвалось. то сделав второе, все работает.
nc localhost 30003 # works, fine
    *type something*
    Ctrl+C


пробуем снова `nc localhost 30003`# not working

Т.е после того, как первый раз мы заскрыли соединение, перестает работать.

если не использовать канал | python3 script.py в bash скрипте, то все работает..

Как это можно починить?
  • Вопрос задан
  • 8832 просмотра
Решения вопроса 1
Sly_tom_cat
@Sly_tom_cat
.
Настроить прослушивание порта средствами Python и не городить огород из утилит, баша и питона.

https://habrahabr.ru/post/149077/
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@viiy
Linux сисадмин \ DevOps
Не могу не упомянуть такие вещи inetd/xinetd
Да, их уже похоронили и даже в ubuntu 14 уже нет
Хотя жаль, они как раз позволяли скриптам/тулзам не имеющим сетевых функций получить возможность слушать что-то по сети
Чисто для истории, текущую задачу целесообразнее выполнить в одном скрипте + какойнибудь supervisord
Ответ написан
Комментировать
Да, питон для этого лучше подойдет.
По поводу умирающих коннекций и невозможности подключиться - там есть модуль "threading".

Вот пример простейшого TCP сервера, который удовлетворяет ваши запросы:
#----------------------------
import socket
import threading
bind_ip = "0.0.0.0"
bind_port = 9999

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind((bind_ip,bind_port))

server.listen(5)

print "[*] Listening on %s:%d" % (bind_ip,bind_port)

# this is our client-handling thread
def handle_client(client_socket):
# print out what the client sends
request = client_socket.recv(1024)
print "[*] Received: %s" % request
# send back a packet
client_socket.send("ACK!")
client_socket.close()

while True:
client,addr = server.accept()
print "[*] Accepted connection from: %s:%d" % (addr[0],addr[1])
# spin up our client thread to handle incoming data
client_handler = threading.Thread(target=handle_client,args=(client,))
client_handler.start()
#------------------------------

Просто вместо ответа в виде ACK, перенаправте данные во второй скрипт.

З.Ы. к сожалению тут не публикует Tab'ы. Для корректной работы скрипта они должны быть у 16-21 и 24-28 строчек.
Ответ написан
delvin-fil
@delvin-fil
Crazy Linux-admin
Когда делаешь ctr+c, не факт, что убьешь процесс. С питоном(выше 3.4) такие "шутки" проходят, а вот 2.7 останется. Будет в памяти торчать.
Проверь:
top|grep python
19884 fil 20 0 31308 8680 4580 R 25,0 0,2 0:00.04 python3.6
20091 fil 20 0 31700 9000 4840 R 1,7 0,2 0:00.05 python3.6
20105 fil 20 0 26236 7716 4484 R 1,0 0,2 0:00.03 python3.6
20091 fil 20 0 53388 11872 6672 S 1,0 0,3 0:00.08 python3.6
А процессы не умерли.
s_1484367062_3222048_9cdba13dc9.png

subprocess.Popen("exit 0", stderr=None, stdout=true, shell=true) в конце проги написать можно, но будет жрать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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