作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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,我认为这与它是管道这一事实有关吗? signal.pid
添加一个进程可靠地杀死第一个子进程 (avconv
),但是第二个进程的 PID(大概是因为它是 sudo ) 与 signal.pid
无关,因此如果不精心设计 top | 就不可能可靠地杀死它grep
语法我还尝试使用 Node process
模块终止进程:
process.kill(this.current.pid,'SIGINT');
这也不起作用。
我怀疑管道 bash 进程在某种程度上是独一无二的,但我对 bash 的结尾有点不适应!
最佳答案
我才想起我遇到过类似的问题,用awk推送命令解决了,
awk '{system("avconv -i http://8273.live.streamtheworld.com:3690/WQHTFMAAC_SC -f wav -ac 1 -ar 22050 - | sudo ./pifm -")}'
PID=$!
setTimeout(function() {
sudo kill $PID #(Can try to force it with kill -9 instead)
},10000)
这样你就真正杀死了拥有该命令的进程。我不确定它是否会在您的环境中起作用。再见了, friend ,希望我能帮到你!
关于bash - Node.js 执行程序 : best way of killing a child pipe and all of its children,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915456/
我是一名优秀的程序员,十分优秀!