Esse inetd
service ou o seu provavelmente está aguardando o EOF antes de sair (e fechar a conexão).
Para fazer isso, você precisaria que o cliente desligasse o lado de envio do soquete enquanto ainda mantinha o lado de recepção aberto. Isso é o que o nc
faz quando detecta EOF no seu stdin.
A interface virtual /dev/tcp/host/port
de bash
(copiada do ksh) não permite isso. Mesmo a alternativa zsh
mais flexível de ztcp
não tem a capacidade de desligar as conexões assimetricamente.
Você poderia confiar em um tempo limite, mas isso não seria confiável. Portanto, é melhor confiar em utilitários dedicados como nc
ou socat
(possivelmente com um coproc para ter uma interface semelhante) ou usar uma linguagem de programação com uma API de rede adequada (com uma interface para shutdown()
). / p>
O caractere 0x04 ( ^D
) significa apenas EOF para dispositivos de terminal quando a disciplina de linha está no modo icanon
(implementa um editor de linha bruto). Então, para que isso funcione, você teria que inserir um pseudo-terminal entre o soquete criado por xinetd
e seu serviço. Por exemplo, iniciando com:
socat - exec:'your-service',pty,raw,icanon,echo=0,discard=,lnext=,werase=,kill=,start=,stop=,rprnt=,erase=,fdout=3
em vez de
your-service
Então você precisa enviar:
printf 'text\n' >&7
Ou:
printf 'text' >&7
para o seu serviço ver o final da entrada.
Por causa desse editor de linhas, your-service
só verá dados quando você envia novos caracteres ou ^D
(desativamos todos os outros caracteres de edição, como werase
, erase
, kill
acima e ^C
, ^Z
... handling também está desativado como parte de raw
).
Assim, você também pode inserir um pré-processador de entrada que saia desse caractere 0x4 como:
awk -v RS='' -v ORS= '{print; exit}' | your-service
(observe que awk
não pode ser mawk
, pois mawk
insiste em não processar sua entrada, desde que não seja recebido um buffer completo ou eof).