在我的項目中,我需要創建一個子進程並通過IPC與它進行通信,同時,這個子進程必須以root身份運行。所以我用cp.spawn('sudo', ...)
與IPC頻道,但我發現process.send
方法是undefined
。node 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工作?
我已經嘗試過,但IPC仍然不起作用。如果我用'process.execPath'替換'sudo',那麼IPC就可以工作。我認爲'sudo'會分叉另一個子進程,就像:'parent.js - > sudo - > child.js'。 – yibn2008