【发布时间】:2013-09-16 19:30:36
【问题描述】:
我有一个 bash 命令,它将音频流从 avconv/ffmpeg 传输到另一个必须使用 sudo 运行的 bash 脚本:
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,我认为这与它是管道这一事实有关? - 我能够通过在
signal.pid中添加一个来可靠地杀死第一个孩子 (avconv),但是第二个进程的 PID(可能是因为它是 sudo)与signal.pid无关,因此不可能无需精心设计top | grep语法即可可靠地杀死 -
我还尝试使用节点
process模块杀死进程:process.kill(this.current.pid,'SIGINT');这也没用。
- 我宁愿避免使用 Node 在两个进程之间进行管道传输,因为我在低内存环境中运行它
我怀疑管道式 bash 进程在某些方面是独一无二的,但我对 bash 的结局有点不满意!
【问题讨论】:
-
我猜
signal的 PID 将代表为运行命令而创建的 shell。 shell 启动的第一个进程是 PID + 1 是有道理的。你会认为杀死 shell 会杀死它启动的进程,但我从来没有用 node 尝试过,也许 sudo 会干扰你尝试终止它。您是否尝试过使用 node 进行分析以管道流以验证您的内存使用问题? -
我还没有尝试将 Node 用于管道,主要是因为管道素材是永久性的并且很大(高带宽音频),因此通过 Node 填充似乎不如在较低级别上使用它理想。不过我会试试看,看看我的结局!
-
在你的脚本中,你杀死了变量而不是它启动的命令。
-
尝试使用 PID=$!然后 sudo kill -9 $PID