2016-12-21 12 views
0

Я использую следующий код, чтобы создать дочерний процесс, который запрашивает пользователя для ввода, а затем он должен завершиться, но событие close никогда не запускается.Детский процесс NodeJS не запускает событие закрытия при записи в STDIN

const spawn = require('child_process').spawn; 
const p = spawn('script', ['that', 'prompts', 'user', 'for', 'input']); 

process.stdin.on('data', (data) => { 
    p.stdin.write(data); 
}); 

p.on('close', (code) => { 
    console.log(`child process closed with code ${code}`); 
}); 

Если я нерест процесс, который не требует от пользовательского ввода (например, ls´), the close` срабатывает событие без какого-либо вопроса. Я подозреваю, что кое-что о написании непосредственно в STDIN дочернего процесса от родительского препятствует его расторгать правильно, но я не могу понять, почему. Я пропустил что-то очевидное здесь?

+0

Этот код работает так, как есть. Попробуйте его с помощью «bc» и введите «quit». Проблема заключается в том, что вы не создаете, фактически не выходите в условиях, которые, по вашему мнению, должны покидать. – pvg

ответ

0

Я написал непосредственно в дочерние процессы над stdin и обработал его, но приложил слушателя к событию «finish» на stdout дочернего процесса. Возможно, это применимо к вашему сценарию использования, возможно, нет.

Если это он lps вы можете прочитать код, который я использовал для его реализации. code here. Обратите внимание, что код еще немного грязный, это был рудиментарный подход к созданию модуля, позволяющего дочерним процессам запускать команды Linux с использованием привилегий sudo в родительском процессе без корня; для этого мне нужен был способ предоставить пароль для sudo. Идея заключалась в том, чтобы разрешить передачу пароля из файла конфигурации, из приглашения stdin или асинхронно разрешаться из Promise, например, из базы данных, где она может храниться зашифрованной и потенциально незашифрованной на этом пути. В конце концов, я хотел бы пересмотреть этот код и переписать его намного лучше, поэтому то, что вы видите, является просто доказательством концепции/экспериментирования. Также он написан в ES6 + (функции стрелок, обещания, классы, конструкторы).

 Смежные вопросы

  • Нет связанных вопросов^_^