我正在为我的Raspberry Pi编写一个非常简单的音乐服务器,它可以按需播放MP#s。我可以使用child_process.exec()
成功启动mpg123
实例,但这个新过程的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>
)。
根据此页面,child_process.execFile(cmd, [args])
将生成一个新的子shell,这是.exec
进程的pid。然后子壳创建了我的mpg123
实例,这就是我想杀死的过程。相反,我使用:
var child = child_process.execFile('mpg123', [filename]); // note filename isn't enquoted
当我想杀死它时,我可以简单地:
child.kill(); // works