我有一个bash命令管道从avconv/ffmpeg的另一个bash脚本必须使用sudo运行的音频流:Node.js的EXEC:杀子管最佳途径,它的所有子
avconv -i http://8273.live.streamtheworld.com:3690/WQHTFMAAC_SC -f wav -ac 1 -ar 22050 - | sudo ./pifm -
Node.js的脚本用来停止脚本不时:
var exec = require("child_process").exec,
signal = null;
var signal = exec("avconv -i http://8273.live.streamtheworld.com:3690/WQHTFMAAC_SC -f wav -ac 1 -ar 22050 - | sudo ./pifm -")
setTimeout(function() {
signal.kill('SIGINT')
},10000)
不幸的是,这并不能杀死无论是在管的过程。
信息的几个进一步位:
- 的管道处理(
console.log(signal.pid)
)不表示任一进程的PID的,这是我假定涉及一个事实,即它是一个管的所得PID? - 我能够可靠地杀死第一个孩子(
avconv
),在signal.pid
中增加一个,但第二个进程的PID(可能是因为它是sudo)与signal.pid
不相关,因此不可能在不调制的情况下可靠地杀死阐述top | grep
语法 我也尝试使用节点
process
模块查杀过程:process.kill(this.current.pid,'SIGINT');
这也不能工作。
- 我宁愿避免使用节点来管这两个进程之间,因为我这运行在低内存环境
我怀疑是管道bash的过程在某种程度上是独一无二的,但我我的联盟中有些事情结束了!
我想'signal'的PID将代表为了运行命令而创建的shell。这将是有道理的,shell启动的第一个进程将是PID + 1.你会认为杀死shell会终止它启动的进程,但我从来没有尝试过与节点,也许sudo干扰你尝试终止它。您是否尝试过使用节点进行分析来管道流以验证您的内存使用情况? – 2013-04-10 04:05:33
我还没有尝试过使用节点进行管道操作,主要是因为管道饲料是永久性的大型(高带宽音频),因此填充Node Node看起来比在较低级别上做的更不理想。我会尝试它,看看我最终结束了! – 2013-04-10 21:26:32
在你的脚本中,你杀死了变量而不是它启动的命令。 – Franko 2013-06-12 18:46:33