child_process.exec创建的两个进程

时间:2015-01-04 21:27:03

标签: node.js child-process

我正在为我的Raspberry Pi编写一个非常简单的音乐服务器,它将按需播放MP#。我可以使用mpg123成功启动child_process.exec()的实例,但这个新进程的PID与实际解码音乐的过程不同。这对我很重要,因为我希望在用户想要停止工作时跟踪该过程(child.kill())。我正在执行如下:

var child = child_process.exec('mpg123 "' + filename + '"');
console.log(JSON.stringify({pid: child.pid});

此输出{"pid":9444},音乐开始播放。但是,当我检查ps aux | grep mpg123时,我会看到两个不同的过程:

pi        9444  0.0  0.1   1760   504 pts/1    S+   18:55   0:00 /bin/sh -c mpg123 "/home/pi/test.mp3"
pi        9445 11.0  0.6  14840  3112 pts/1    S+   18:55   0:00 mpg123 /home/pi/test.mp3

后一个过程,9445,实际上正在播放我的mp3。如果我根据请求挂起child.kill(),第一份工作就会被杀死,但第二份工作仍然存在,导致杀人无效。

是否有不同的方法来创建一个避免这种情况的流程,或者更好的方法来杀死它?我宁愿不必跟踪所有内容(例如,我用来创建它的命令)并尝试根据它来追踪'正确'(例如,ps aux | grep <filename>)。

1 个答案:

答案 0 :(得分:1)

根据this pagechild_process.execFile(cmd, [args])将生成一个新的子shell,它是.exec'd进程的pid。子shell然后创建了mpg123的实例,这是我想要杀死的进程。相反,我使用:

var child = child_process.execFile('mpg123', [filename]); // note filename isn't enquoted

当我想要杀死它时,我可以简单地说:

child.kill(); // works