我正在为我的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>
)。
答案 0 :(得分:1)
根据this page,child_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