Assim que a escuta nc
(servidor) for fechada, o cliente nc
também será encerrado.
No Mac OS X, você pode open -a 'Activity Monitor'
verificar isso.
O motivo pelo qual o nc & cat
de exemplo trava não é nc
, mas cat
, que continua mantendo seu stdin e stdout abertos para leitura e gravação.
No entanto, quando cat
tentar gravar no canal depois que a escuta nc
tiver sido fechada, SIGPIPE
será gerado e cat
será encerrado.
# cat & SIGPIPE test
(sleep 1; echo hi) |
(trap 'echo "received signal $(($? - 128))" 1>&2' EXIT; cat) | :
kill -l 13
man bash | less -p 'EXIT STATUS'
man bash | less -Ip '128\+n'
Como uma alternativa para a solução alternativa de Niklas Berglund, é possível interceptar a saída do cliente nc
para eliminar todo o grupo de processos, incluindo o comando cat
pendente.
# console 1
# ctrl-c will "kill 0" entire process group sh -c '...'
nc -l 8080
# console 2
# script command (FreeBSD version) will implicitly run: man 2 setsid
# kill 0 will therefore only kill the entire process group sh -c '...'
# run in a script kill 0 would otherwise kill the entire script
# cf. also https://github.com/jerrykuch/ersatz-setsid
script -q /dev/null sh -c '
(echo "my instruction here"; cat) | (trap "kill 0" EXIT; nc 127.0.0.1 8080)
'