В документации по дочернему процессу Node JS. Упоминается следующее:
По умолчанию каналы для stdin, stdout и stderr устанавливаются между родительским процессом Node.js и порожденным потомком. Эти каналы имеют ограниченную (и определяемую платформой c) емкость. Если дочерний процесс записывает в стандартный вывод, превышающий этот лимит без захвата выходных данных, дочерний процесс блокирует ожидание, пока буфер канала не примет больше данных.
Я пытался порождать (child_process.spawn) консольное приложение с узла. Приложение является интерактивным и выдает много данных по инициации. Очевидно, что при передаче по каналу, если процесс, выводящий данные, получает заголовок процесса, получающего ввод, ОС приостанавливает вывод процесса. Например, когда вы запускаете ps ax | cat
, если процесс ps
опережает процесс cat
, ps
приостанавливает работу до тех пор, пока cat
не сможет снова принять ввод. Но в конечном итоге он должен передать все данные.
В моем случае это консольное приложение (написанное в C), кажется, полностью останавливается, когда это происходит. Я могу ошибаться, но, похоже, это так, потому что конвейерный вывод останавливается на полпути независимо от того, что я делаю. Это происходит даже тогда, когда я пью от bash, поэтому здесь нет проблем с nodejs. Может быть, это приложение не очень совместимо с тем, как работает конвейер в linux.
Я ничего не могу сделать с этим консольным приложением, но есть ли какой-то другой способ в узле получить эти блоки данных без конвейера?
Отредактировано:
Основной код
const js = spawn('julius', ['-C', 'julius.jconf', '-dnnconf', 'dnn.jconf']);
Я пробовал
js.stdout.on("data", (data) => { console.log(`stdout: ${js.stdout}`); });
и
js.stdout.pipe(process.stdout);
чтобы захватить вывод. Результат тот же, вывод обрезается.