当前位置: 首页 > 面试题库 >

在node.js中生成并杀死进程

司徒杜吟
2023-03-14
问题内容

我试图在javascript中生成一个进程,并在一段时间后将其杀死(出于测试目的)。

最后,该过程将是一个无限循环,我需要在指定的时间使用不同的参数重新启动,因此我认为生成该过程并杀死它是执行此操作的最佳方法。

我的测试代码是:

var spawn=require('child_process').spawn
, child=null;

child=spawn('omxplayer', ['test.mp4'], function(){console.log('end');}, {timeout:6000});
console.log('Timeout');
setTimeout(function(){
    console.log('kill');
    child.kill();
}, 1200);

child.stdout.on('data', function(data){
    console.log('stdout:'+data);
});

child.stderr.on('data', function(data){
    console.log('stderr:'+data);
});

child.stdin.on('data', function(data){
    console.log('stdin:'+data);
});

结果是:

#~$ node test.js
Timeout
kill

但是我仍然需要发送ctrl + C来结束程序。我想念什么?

在Raspbian的节点0.10.17上,omxplayer是二进制文件(视频播放器)。

我试过了:

  • 添加chmod +x应用程序
  • 以root身份启动。
  • 子进程的标准输入暂停。在kill命令中使用所有与终止相关的信号。

ps在应用运行时,我还启动了一个命令:

2145    bash
2174    node
2175    omxplayer
2176    omxplayer.bin
2177    ps

因此,omxplayer是一个包装器,结束时谁不会杀死它的子进程,是否有任何方法可以获取包装后的进程的pid?

仍然咬灰尘,尝试了这个:

spawn('kill', ['-QUIT', '-$(ps opgid= '+child.pid+')']);

我以为会杀死omxplayer的所有子级,我不知道使用这样的spawn是错误的还是代码不起作用。

我所做的最后一个编辑是一个很好的答案,但是必须进行一些编辑。

我创建了一个sh文件(具有执行权限),如下所示:

PID=$1
PGID=$(ps opgid= "$PID")
kill -QUIT -"$PGID"

我是这样开始的:

execF('kill.sh', [child.pid], function(){
    console.log('killed');
});

代替child.kill

我不确定这是否是最好的方法,也不确定代码是否干净,但确实有效。

我会接受任何更干净或更有效的答案,而不必执行文件。


问题答案:

参考此讨论

一旦开始在stdin上侦听数据,node将等待在stdin上的输入,直到被告知不这样做为止。当用户按下ctrl-d(表示输入结束)或程序调用stdin.pause()时,节点将停止等待stdin。

除非没有任何事情要做或等待,否则节点程序不会退出。发生的是,它在标准输入上等待,因此永不退出。

尝试将setTimeout回调更改为

console.log('kill');
child.stdin.pause();
child.kill();

我希望它能起作用。



 类似资料:
  • 我们试图将我们的一个node js应用程序(AngularJS/NodeJS tech stack)部署到生产环境中。随机地,当节点进程被终止时,一些ec2实例就停止了。但是没有记录应用程序/系统级别的错误消息。我们无法在本地/开发/it环境中重现此问题。有人面临过类似的事情吗?非常感谢任何帮助。谢谢!

  • 问题内容: 我正在使用child_process.spawn()从在Ubuntu上运行的Node.JS应用程序启动脚本。据我所知,标准的分叉或生成的* nix进程通常不会在父进程死后死亡,但是当从Node.JS生成进程时,它们似乎在我的应用程序崩溃或被ctrl-c等终止时被杀死。 。 为什么会这样,并且有解决办法?我似乎在child_process API中找不到任何明显的选项。 我的应用程序启动

  • 问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其

  • 问题内容: 我试图在Sublime上为Node.js建立一个构建系统,所以我可以按F7键在打开的文件上调用“节点”。问题在于该过程将永远开放,因此,第二次使用F7时,我会获得一个加载项。 有没有办法可以杀死来自node.js的打开的“ node.exe”进程? 问题答案: 使用以下命令集来标识在给定端口上运行的进程并从命令行终止该进程 它将输出类似于以下所示的详细信息 然后使用 终止该过程。使用再

  • 我正在尝试为Node建立一个构建系统。js在sublime上,所以我可以按F7在打开的文件上调用“节点”。问题是,该过程将永远打开,因此,第二次使用F7时,我将使用一个外接程序。 有没有办法杀死node.js?打开的“node.exe”进程

  • 问题内容: 使用shelljs创建一个子进程 杀死父进程后,子进程仍在运行.. 问题答案: 如果您可以使用node的内置,则可以向子进程发送信号: 这样做的好处是,主进程应该一直徘徊,直到所有子进程都终止。