Executando script bash canalizado em segundo plano

Executando script bash canalizado em segundo plano

Estou tentando construir um script de monitoramento para observar a comunicação do host local usando o netcat. Eu tenho dois scripts que criei, um para iniciar o loop de monitoramento e outro para o próprio loop. Eles são os seguintes:

iniciar.sh

#!/bin/bash
netcat localhost 1099  | bash loop.sh &

loop.sh

#!/bin/bash
while read sInput; do
     ...do something with $sInput
done

Simplesmente executar este aplicativo sem estar em primeiro plano funciona bem, mas assim que tento executar este script em segundo plano, ele passa de executado para interrompido instantaneamente. Alguém poderia me explicar por que isso está acontecendo e como aliviar o problema.

Meu objetivo final é ter um script bash com o qual eu possa criar um script daemon do arch linux e fazer com que tudo funcione perfeitamente. Sua ajuda é apreciada.

Responder1

Parece que está lendo a entrada padrão (stdin). Tente adicionar a -dopção (Não tente ler do stdin) ao netcat. Ou redirecione na linha de comando:

netcat localhost 1099 <&- | bash loop.sh &

Você também pode querer usar nohuppara ter certeza de que não será afetado negativamente quando/se você sair desse shell antes que ele pare.

Responder2

O processo netcat está lendo sua entrada padrão. Como está conectado ao terminal, o grupo de processos em que o netcat está (ou seja, o pipeline) deve ser executado em primeiro plano.

Você precisa conectar algo no início do pipeline que enviará a entrada que o servidor espera. Por exemplo, com um servidor HTTP, você pode ter algo como

netcat localhost 1099 <<EOF | … &
GET HTTP/1.0 http://localhost:1099/somewhere
X-Header: wibble

EOF

Se o servidor não ler nenhuma entrada, redirecione netcata entrada de /dev/null.

Responder3

Descobrimos um utilitário que promete fornecer pipes sem a necessidade de um novo script bash daemonizado separado. Pode ser útil:https://github.com/flonatel/pipexec

pipexec -- [NETCAT netcat localhost 1099]  [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'

informação relacionada