2015-01-04 2 views
0

Я пишу довольно простой музыкальный сервер для своей малины Pi, которая будет играть MP # s по требованию. Я могу успешно запустить экземпляр mpg123 с использованием child_process.exec(), но PID этого нового процесса отличается от процесса, фактически декодирующего музыку. Это важно для меня, потому что я хочу отслеживать процесс в случае, если пользователь хочет остановить работу (child.kill()). Я выполнение следующим образом:Два процесса, созданных child_process.exec

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

попробовать 'spawn'. 'exec' запускает оболочку, как вы можете видеть – vkurchatkin

+0

' child_process.spawn ('mpg123', ['' '+ filename +' '']) 'дает мне PID, но он не запускает музыку, а процесс не работает когда я grep для одного в консоли. – user655321

ответ

1

Согласно this page, child_process.execFile(cmd, [args]) будет порождать новую подоболочку, которая является pid процесса .exec. Затем подоболочка создала мой экземпляр mpg123, который является процессом, который я хотел убить. Вместо этого я использую:

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

И когда я хочу, чтобы убить его, я могу просто:

child.kill(); // works 
Смежные вопросы