canaliza dados para o processo que já foi iniciado

2

Digamos que eu inicie um processo node.js da seguinte forma:

node script.js &

Existe uma maneira de enviar dados para esse processo depois que ele foi iniciado?

normalmente, fazemos isso:

cat <file> | node script.js 

mas o problema que estou vendo é que, às vezes, o processo node.js não é iniciado de antemão.

Meu objetivo é garantir que o processo node.js seja iniciado, não importa o que acontecer, mesmo que não haja dados no arquivo.

Então, eu estava pensando em iniciar o processo node.js como um processo em segundo plano e, em seguida, conectá-lo a um pipe, não tenho certeza se isso é possível.

    
por Alexander Mills 08.07.2017 / 04:35

1 resposta

4

Parece que você está procurando por uma variante de pipes nomeados (fifos) criados com mkfifo .

Então você pode fazer algo assim:

mkfifo my-pipe
node script.js < my-pipe &

Observe que bloqueará até que algo abra my-pipe para gravação. Então, se você quiser que o script.js seja capaz de abrir o arquivo (mas obviamente não leia nada dele), então você precisa abri-lo para escrever; uma maneira trivial é apenas redirecionar um sono para ele ( sleep 3650d > my-pipe & ). Isso também impedirá que o script.js receba um EOF (final de arquivo) até que você mate o sono (quando nada tiver um fifo aberto para gravação e todos os dados tiverem desaparecido, o lado da leitura obterá um EOF).

Agora, você pode fornecer mais linhas sempre que escrever para o my-pipe. Qualquer gravação que não busque (ou mmap, etc.) funcionará. Você poderia testar com echo 'DATA' > my-pipe .

Então, juntos:

mkfifo my-pipe
node script.js < my-pipe &
sleep 3650d > my-pipe &
sleep_pid=$!
get-data-command > my-pipe     # placeholder for real command to get data
get-data-command > my-pipe
# and so on, for more data.
kill $sleep_pid                # kill the sleep, giving script.js an EOF.

Como indica o Wildcard, você pode querer que o script.js abra um soquete de escuta e aceite os dados dessa maneira. Você pode usar soquetes de domínio Unix se quiser evitar a necessidade de lidar com a autenticação como em um soquete TCP (porque os soquetes Unix usam permissões de arquivo).

    
por 08.07.2017 / 06:53