Ejecutando script bash canalizado en segundo plano

Ejecutando script bash canalizado en segundo plano

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 -dopció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 nohuppara 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 netcatla 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}'

información relacionada