Estoy intentando crear un script de monitoreo para observar la comunicación del host local usando netcat. Tengo dos scripts que he creado, uno para iniciar el ciclo de monitoreo y otro para el ciclo mismo. Son los siguientes:
inicio.sh
#!/bin/bash
netcat localhost 1099 | bash loop.sh &
bucle.sh
#!/bin/bash
while read sInput; do
...do something with $sInput
done
Simplemente ejecutar esta aplicación sin estar en primer plano funciona bien, pero tan pronto como intento ejecutar este script en segundo plano, pasa de ejecutarse a detenerse instantáneamente. ¿Podría alguien explicarme por qué sucede esto y cómo aliviar el problema?
Mi objetivo final es tener un script bash con el que pueda crear un script demonio de Arch Linux y que todo funcione perfectamente. Tu ayuda es apreciada.
Respuesta1
Parece que está leyendo desde la entrada estándar (stdin). Intente agregar la -d
opción (No intentar leer desde la entrada estándar) a netcat
. O redirigir en la línea de comando:
netcat localhost 1099 <&- | bash loop.sh &
También es posible que desee utilizarlo nohup
para asegurarse de que no se verá afectado negativamente cuando salga de ese shell antes de que se detenga.
Respuesta2
El proceso netcat lee desde su entrada estándar. Dado que está conectado a la terminal, el grupo de procesos en el que se encuentra netcat (es decir, la canalización) debe ejecutarse en primer plano.
Debe conectar algo al comienzo de la canalización que enviará la entrada que espera el servidor. Por ejemplo, con un servidor HTTP, es posible que tenga algo como
netcat localhost 1099 <<EOF | … &
GET HTTP/1.0 http://localhost:1099/somewhere
X-Header: wibble
EOF
Si el servidor no lee ninguna entrada, redirige netcat
la entrada desde /dev/null
.
Respuesta3
He descubierto una utilidad que promete proporcionar canalizaciones sin la necesidad de un nuevo script bash demonizado independiente. Puede resultar útil:https://github.com/flonatel/pipexec
pipexec -- [NETCAT netcat localhost 1099] [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'