2016-12-21 62 views
0

我正在使用下面的代碼來產生一個子進程,要求用戶輸入,然後它應該完成,但是從未觸發close事件。當寫入STDIN時,NodeJS子進程沒有觸發關閉事件

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,並且處理它,但在子進程的標準輸出上附加了「完成」事件的偵聽器。也許它適用於你的使用場景,也許不適用。

如果他lps你可以閱讀我用來實現它的代碼。 code here。 請注意,代碼仍然有點混亂,這是一個基本的方法來生產一個模塊,以允許子進程在非根父進程中使用sudo權限運行Linux命令;爲了做到這一點,我需要一種方法來提供sudo的密碼。這個想法是允許密碼從配置文件,stdin提示符,或者從異步地從Promise解析出來,比如從數據庫中提取密碼,在那裏它可以被加密存儲,並且可能在加密時被解密。最後,我想重新訪問該代碼並重寫它,所以你看到的僅僅是概念/實驗的證明。它也是用ES6 +(箭頭函數,承諾,類,構造函數)編寫的。

相關問題