2017-03-08 70 views
0

在我的項目中,我需要創建一個子進程並通過IPC與它進行通信,同時,這個子進程必須以root身份運行。所以我用cp.spawn('sudo', ...)與IPC頻道,但我發現process.send方法是undefinednode sudo with sudo can not use ipc

下面是代碼:

文件:parent.js

'use strict' 

const cp = require('child_process') 
const path = require('path') 

const script = path.join(__dirname, 'child.js') 

let child = cp.spawn('sudo', [process.execPath, script], { 
    stdio: ['inherit', 'inherit', 'inherit', 'ipc'] 
}) 

child.on('message', msg => { 
    console.log('message> ', msg) 
}) 

console.log('parent> parent run!') 

文件:child.js

'use strict' 

console.log('child> child run!') 

process.send('hahaha') 

運行node parent.js

parent> parent run! 
Password: 
child> child run! 
/Users/zoujie.wzj/workbench/child.js:5 
process.send('hahaha') 
     ^

TypeError: process.send is not a function 
    at Object.<anonymous> (/Users/zoujie.wzj/workbench/child.js:5:9) 
    at Module._compile (module.js:570:32) 
    at Object.Module._extensions..js (module.js:579:10) 
    at Module.load (module.js:487:32) 
    at tryModuleLoad (module.js:446:12) 
    at Function.Module._load (module.js:438:3) 
    at Module.runMain (module.js:604:10) 
    at run (bootstrap_node.js:394:7) 
    at startup (bootstrap_node.js:149:9) 
    at bootstrap_node.js:509:3 

更新:我與cp.spawn(process.execPath, ...)取代cp.spawn('sudo', ...)後,程序將工作:

parent> parent run! 
child> child run! 
message> hahaha 

是任何人的已知,IPC爲什麼不使用sudo工作?

回答

0

如文檔中提到的:

如果孩子是Node.js的過程中,IPC信道的存在將使process.send(),process.disconnect(),process.on( 'disconnect')和process.on('message')。

https://nodejs.org/api/child_process.html#child_process_options_stdio

只有你所產卵是節點處理的情況,process.send()方法將被啓用。

在你的情況下,你產生了一個sudo進程,而運行child.js的Node參數爲sudo,而不是從parent.js產生。所以process.send()將不會啓用,這就是爲什麼child.js拋出錯誤。

所以child.send()實際上發送到sudo進程而不是node child.js預期。

正如你問爲什麼IPC不適用於sudo:我認爲IPC正在工作。但是,如上所述,您正在嘗試使用sudo流程的IPC,該流程實際上並不瞭解或不會對您的child.send()操作做出響應。

0

嘗試刪除全部inherit和IPC應該工作。

請注意,您的代碼不會打印孩子發送的'hahaha'消息,因爲您沒有等待或阻止;所以當你運行parent.js時,它會執行每一行,然後靜靜地(乾淨地)退出。

+0

我已經嘗試過,但IPC仍然不起作用。如果我用'process.execPath'替換'sudo',那麼IPC就可以工作。我認爲'sudo'會分叉另一個子進程,就像:'parent.js - > sudo - > child.js'。 – yibn2008