【问题标题】:Node.js exec: best way of killing a child pipe and all of its childrenNode.js exec:杀死子管道及其所有子管道的最佳方法
【发布时间】: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

标签: bash node.js


【解决方案1】:

我只记得我有一个类似的问题,并通过使用 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)

这样你就真的杀死了拥有该命令的进程。我不确定它是否会在您遇到困难的情况下起作用。再见朋友希望我能帮到你!

【讨论】:

    【解决方案2】:

    试试

    process.kill(-signal.pid);
    

    终止整个进程组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多