Получение выходных данных от отдельного порожденного дочернего процесса - PullRequest
0 голосов
/ 30 января 2020

Я использую node.js для запуска некоторой операции оболочки, которая занимает некоторое время, например:

find / -name myfile

Итак, у меня есть

require('child_process').spawn('find', ['/', '-name', filename]);

Как я хочу, чтобы дочерний процесс продолжить, если основной процесс умирает (предположим, что он также записывает результаты в файл), я использую следующие параметры:

require('child_process').spawn('find', ['/', '-name', filename], {detached: true, stdio: 'ignore'});

Однако это означает, что я не могу получить никаких данных о процессе, пока он работает, по крайней мере, не через stdout / stderr. Мой вопрос заключается в том, требует ли решение, чтобы дочерний процесс выполнял запись в какой-либо ресурс, и основной процесс, чтобы опросить этот ресурс на предмет обновлений, или существует какой-то обходной путь для передачи данных таким образом, чтобы не создавать зависимость между дочерним процессом. процесс и основной процесс (может быть, с помощью mkfifo?).

1 Ответ

0 голосов
/ 30 января 2020

Я нашел хорошее решение, используя Redis Pub / Sub: оба процесса подключаются к каналу Redis с одинаковым именем, основной процесс подписывается на этот канал при запуске / перезапуске, а порожденный процесс отправляет сообщения о прогрессе на этот канал. со связанным идентификатором процесса. Это требует запуска сервера Redis, но в этом случае я уже использовал Redis. Причина, по которой мне нравится это решение, заключается в том, что оно не требует ручного опроса каких-либо данных на диске или в памяти и может быть масштабировано для нескольких порожденных процессов, записывающих сообщения на один и тот же канал Redis.

...