Bash Node.js exec:杀死子管道及其所有子管道的最佳方法

Bash Node.js exec:杀死子管道及其所有子管道的最佳方法,bash,node.js,Bash,Node.js,我有一个bash命令,它将音频流从avconv/ffmpeg传输到另一个bash脚本,该脚本必须与sudo一起运行: avconv-ihttp://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 =

我有一个bash命令,它将音频流从avconv/ffmpeg传输到另一个bash脚本,该脚本必须与sudo一起运行:

avconv-ihttp://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)
不幸的是,这并没有杀死管道中的任何一个进程

更多信息:

  • 管道化进程的结果PID(
    console.log(signal.PID)
    )并不表示这两个进程的PID,我认为这与它是管道这一事实有关
  • 通过在
    信号.pid
    中添加一个,我能够可靠地杀死第一个孩子(
    avconv
    ),但是第二个进程的pid(可能是因为它是sudo)与
    信号.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)
这样,您就可以真正杀死拥有该命令的进程。我不确定它在你的环境下是否有效。再见了,朋友,希望我帮了你

试试看

process.kill(-signal.pid);

终止整个进程组。

我猜
信号的PID将表示为运行命令而创建的shell。shell启动的第一个进程是PID+1,这是有道理的。您可能认为终止shell会终止它启动的进程,但我从未尝试过使用node,也许sudo干扰了您终止它的尝试。您是否尝试过使用node对流进行评测以验证内存使用问题?我还没有尝试使用node对流进行评测,主要是因为pipe foeder是永久性的和大的(高带宽音频),因此填充thru-node似乎不如在较低级别上进行。我会试试看,看看我的结局如何!在脚本中,您可以杀死变量,而不是它启动的命令。请使用PID=$尝试exec(“avconv-i-f wav-ac 1-ar 22050-| sudo./pifm-”)!然后是sudo kill-9美元PID