我已经设置了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一起使用,我知道这些Pid不是null或未定义如下:kill = require('tree-kill')
和{ {1}}。
现在这个过程,或者更确切地说,音乐会在满足相同条件的情况下停止,但它不会与其他条件一起播放,播放另一首歌曲。而是在服务器控制台中输出以下内容:
kill(child.pid)
所以我认为我已经在正确的方向上取得了进展,现在我知道我有正确的过程,而且mPlayer确实被打断了,但新歌没有播放。
答案 0 :(得分:0)
这不起作用的原因是因为没有发送正确的终止信号。
作为默认信号的SIGTERM信号是用于导致程序终止的通用信号。与SIGQUIT不同,可以阻止,处理和忽略此信号。这是礼貌地要求程序终止的正常方式。
由于应用程序应该立即终止进程,我们使用SIGQUIT。
调整子进程的超时和缓冲区以使其完成也很重要。