Почему nodejs закрывает стандартный вывод процесса при ожидании? - PullRequest
0 голосов
/ 21 ноября 2018
const p = spawn('ls', ['/'])
console.log('$mark$')
p.stdout.pipe(process.stdout)

Приведенный выше код точно печатает список файлов корневого каталога, а именно:

$mark$
bin
boot
data
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
solr.log
srv
sys
tmp
usr
var

Однако, если я жду некоторое время, например 1 секунду, он ничего не печатает.Код ниже:

const p = spawn('ls')
setTimeout(() => {
  console.log('$mark$')
  p.stdout.pipe(process.stdout)
}, 1000)

, который печатает только:

$mark$

Интересно, почему второй код не печатает никакого содержимого команды ls.

Среда:

  • Linux: openSUSE Leap 42,3
  • Узел: v8.11.1

1 Ответ

0 голосов
/ 22 ноября 2018

Во втором примере кода, ls уже давно завершен со своим выводом к тому времени, когда вы попытаетесь обработать вывод и передать его по конвейеру.Node.js обычно не собирается буферизовать неиспользуемый канал для вас.Вы должны передать его до начала вывода, иначе вы потеряете данные или .pause() это.

...