Eu tenho um script Bash que começa abrindo um soquete de cliente TCP usando nc
e enviando um comando start sobre esse soquete. O servidor me envia de volta os dados pelo soquete (que nc
imprime para stdout
) e, quando o usuário está satisfeito com os dados que viu, eles pressionam Ctrl + C e o script deve enviar um pare o comando sobre o soquete para dizer ao servidor para parar de fazer o que está fazendo.
Para manter o soquete nc
aberto por um período de tempo arbitrário, abro um FIFO e tail -n +1 -f
desse FIFO em nc
e, assim, para enviar comandos pelo soquete, o script simplesmente echo
es para o FIFO.
Mas depois que meu manipulador de sinal é executado, a chamada echo
que envia o comando de parada trava / congela e nunca retorna, e assim o script fica lá.
Aqui está o meu código (simplificado):
#! /bin/bash
# make a FIFO to use as STDIN for netcat
FIFO=/tmp/temp_fifo
mkfifo $FIFO
# open up the client socket
TAIL_PID_FILE=/tmp/tail_pid
(tail -n +1 -f $FIFO & echo $! >&3) 3> $TAIL_PID_FILE | /usr/bin/nc some_server 9999 &
# get PID of tail process
TAIL_PID=$(<$TAIL_PID_FILE)
# send the start command to tell the server to start doing its work
echo "start command" >> $FIFO
# register a signal handler so that we wait until the user presses Ctrl+C
trap "echo caught signal, stopping..." SIGINT SIGTERM
# sleep 'forever' (until the signal gets caught)
sleep 4294967295
# send the stop command. ***this right here is what hangs***
echo "stop command" >> $FIFO
# kill tail process
kill $TAIL_PID
# remove FIFO
rm -f $FIFO
Ao executar isso no Linux, no Bash versão 4.1.2, isso é executado normalmente - ou seja, o echo
não trava e assim o comando de parada é enviado com sucesso. Mas BusyBox (versão 1.22.1, no Windows / MobaXterm) trava nele.
Estou fazendo algo errado aqui (por exemplo, comportamento indefinido) em relação ao meu manipulador de sinal, daí porque meu código não funciona no BusyBox? Ou isso pode sugerir um bug ou um recurso ausente que não conheço no BusyBox?
Tags bash busybox shell-script