我如何在 Debian 上通过 node.js 中的引用变量停止子进程?
How can i stop a child process by its reference variable in node.js on Debian?
我设置了 Node.js 服务器,我正在尝试停止满足某些条件时启动的进程。
这是我的服务器脚本:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var fs = require('fs');
var sys = require('sys')
var exec = require('child_process').exec;
var child;
var musicDirectory = __dirname + '/music/';
var musicFiles = [];
fetchMusic();
server.listen(80);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/views/index.html');
});
io.on('connection', function (socket) {
console.log("We have a new visitor.");
socket.emit('music', {files: musicFiles} );
socket.on('File to play', function (fileToPlay) {
exec("ls " + musicDirectory, function (error, stdout, stderr) {
var filesInMusicDirectory = stdout.split("\n");
for (var i = 0; i < filesInMusicDirectory.length; i++) {
if (filesInMusicDirectory[i] == fileToPlay) {
if (typeof child !== "undefined") {
child.kill();
console.log("Killing process");
}
child = exec("mplayer " + "'" + musicDirectory + fileToPlay + "'");
console.log(fileToPlay + " is in directory.");
break;
}
}
if (error !== null) {
console.log('exec error: ' + error);
}
});
});
});
function fetchMusic()
{
fs.readdir(musicDirectory, function(err,data) {
for (var i = 0; i < data.length; i++) {
musicFiles.push(data[i]);
};
});
}
如您所知,我在第 8 行声明了一个名为 child
的变量,我正在使用它:child = exec("mplayer " + "'" + musicDirectory + fileToPlay + "'");
.
现在,我想做的就是在满足某些条件时停止此过程,所以我正在尝试使用 child.kill()
。
我的小实验的功能达到了我想要终止子进程的程度。它不会那样做,child.kill()
函数似乎失败了,可能是因为我误解了什么。
谁能帮我理解为什么这个过程不会结束。我在写这篇文章的时候正在阅读文档,但是还有很多事情要做。
我的问题是:为什么 kill() 函数不停止使用我的代码的进程,我该怎么做才能实现我想要的?
更新
好的,我已经摆弄了一下。我添加了 tree-kill,因为 child.kill() 功能不起作用,并尝试将它与从子进程中提取的 Pid 一起使用,我知道它不是空的或未定义的,如下所示:kill = require('tree-kill')
和 kill(child.pid)
.
现在,这个过程,或者更确切地说,音乐在满足相同条件时停止,但它不会继续播放其他歌曲。相反,在服务器控制台中输出以下内容:
Baby (metal cover by Leo Moracchioli).mp3 fed to mPlayer
undefined
STDOUT: MPlayer2 2.0-728-g2c378c7-4+b1 (C) 2000-2012 MPlayer Team
Cannot open file '/root/.mplayer/input.conf': No such file or directory
Failed to open /root/.mplayer/input.conf.
Cannot open file '/etc/mplayer/input.conf': No such file or directory
Failed to open /etc/mplayer/input.conf.
Playing /home/danlevi/Documents/NodeServer/music/Bad Blood (metal cover by Leo Moracchioli).mp3.
Detected file format: MP2/3 (MPEG audio layer 2/3) (libavformat)
[mp3 @ 0xb62803a0]max_analyze_duration 5000000 reached
[lavf] stream 0: audio (mp3), -aid 0
Clip info:
major_brand: dash
minor_version: 0
compatible_brands: iso6mp41
creation_time: 2015-09-29 08:04:29
encoder: Lavf54.20.4
Load subtitles in /home/danlevi/Documents/NodeServer/music/
Selected audio codec: MPEG 1.0/2.0/2.5 layers I, II, III [mpg123]
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
MPlayer interrupted by signal 15 in module: unknown
Exiting... (Quit)
A: 9.1 (09.0) of 281.8 (04:41.7) 0.2%
A: 9.1 (09.0) of 281.8 (04:41.7) 0.2%
所以我认为我在正确的方向上取得了一些进展,现在我知道我有正确的过程,mPlayer确实中断了,但是新歌没有播放。
之所以不起作用,是因为没有发送正确的终止信号。
作为默认信号的 SIGTERM 信号是用于导致程序终止的通用信号。与 SIGQUIT 不同,此信号可以被阻塞、处理和忽略。这是礼貌地要求程序终止的正常方式。
由于应用程序应立即终止进程,我们使用 SIGQUIT。
调整子进程的超时和缓冲区也很重要,以便它完成。
我设置了 Node.js 服务器,我正在尝试停止满足某些条件时启动的进程。
这是我的服务器脚本:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var fs = require('fs');
var sys = require('sys')
var exec = require('child_process').exec;
var child;
var musicDirectory = __dirname + '/music/';
var musicFiles = [];
fetchMusic();
server.listen(80);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/views/index.html');
});
io.on('connection', function (socket) {
console.log("We have a new visitor.");
socket.emit('music', {files: musicFiles} );
socket.on('File to play', function (fileToPlay) {
exec("ls " + musicDirectory, function (error, stdout, stderr) {
var filesInMusicDirectory = stdout.split("\n");
for (var i = 0; i < filesInMusicDirectory.length; i++) {
if (filesInMusicDirectory[i] == fileToPlay) {
if (typeof child !== "undefined") {
child.kill();
console.log("Killing process");
}
child = exec("mplayer " + "'" + musicDirectory + fileToPlay + "'");
console.log(fileToPlay + " is in directory.");
break;
}
}
if (error !== null) {
console.log('exec error: ' + error);
}
});
});
});
function fetchMusic()
{
fs.readdir(musicDirectory, function(err,data) {
for (var i = 0; i < data.length; i++) {
musicFiles.push(data[i]);
};
});
}
如您所知,我在第 8 行声明了一个名为 child
的变量,我正在使用它:child = exec("mplayer " + "'" + musicDirectory + fileToPlay + "'");
.
现在,我想做的就是在满足某些条件时停止此过程,所以我正在尝试使用 child.kill()
。
我的小实验的功能达到了我想要终止子进程的程度。它不会那样做,child.kill()
函数似乎失败了,可能是因为我误解了什么。
谁能帮我理解为什么这个过程不会结束。我在写这篇文章的时候正在阅读文档,但是还有很多事情要做。
我的问题是:为什么 kill() 函数不停止使用我的代码的进程,我该怎么做才能实现我想要的?
更新
好的,我已经摆弄了一下。我添加了 tree-kill,因为 child.kill() 功能不起作用,并尝试将它与从子进程中提取的 Pid 一起使用,我知道它不是空的或未定义的,如下所示:kill = require('tree-kill')
和 kill(child.pid)
.
现在,这个过程,或者更确切地说,音乐在满足相同条件时停止,但它不会继续播放其他歌曲。相反,在服务器控制台中输出以下内容:
Baby (metal cover by Leo Moracchioli).mp3 fed to mPlayer
undefined
STDOUT: MPlayer2 2.0-728-g2c378c7-4+b1 (C) 2000-2012 MPlayer Team
Cannot open file '/root/.mplayer/input.conf': No such file or directory
Failed to open /root/.mplayer/input.conf.
Cannot open file '/etc/mplayer/input.conf': No such file or directory
Failed to open /etc/mplayer/input.conf.
Playing /home/danlevi/Documents/NodeServer/music/Bad Blood (metal cover by Leo Moracchioli).mp3.
Detected file format: MP2/3 (MPEG audio layer 2/3) (libavformat)
[mp3 @ 0xb62803a0]max_analyze_duration 5000000 reached
[lavf] stream 0: audio (mp3), -aid 0
Clip info:
major_brand: dash
minor_version: 0
compatible_brands: iso6mp41
creation_time: 2015-09-29 08:04:29
encoder: Lavf54.20.4
Load subtitles in /home/danlevi/Documents/NodeServer/music/
Selected audio codec: MPEG 1.0/2.0/2.5 layers I, II, III [mpg123]
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
MPlayer interrupted by signal 15 in module: unknown
Exiting... (Quit)
A: 9.1 (09.0) of 281.8 (04:41.7) 0.2%
A: 9.1 (09.0) of 281.8 (04:41.7) 0.2%
所以我认为我在正确的方向上取得了一些进展,现在我知道我有正确的过程,mPlayer确实中断了,但是新歌没有播放。
之所以不起作用,是因为没有发送正确的终止信号。
作为默认信号的 SIGTERM 信号是用于导致程序终止的通用信号。与 SIGQUIT 不同,此信号可以被阻塞、处理和忽略。这是礼貌地要求程序终止的正常方式。
由于应用程序应立即终止进程,我们使用 SIGQUIT。
调整子进程的超时和缓冲区也很重要,以便它完成。