如何通过Debian上node.js中的引用变量来停止子进程?

时间:2016-01-17 17:09:13

标签: javascript node.js socket.io child-process mplayer

我已经设置了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确实被打断了,但新歌没有播放。

1 个答案:

答案 0 :(得分:0)

这不起作用的原因是因为没有发送正确的终止信号。

作为默认信号的SIGTERM信号是用于导致程序终止的通用信号。与SIGQUIT不同,可以阻止,处理和忽略此信号。这是礼貌地要求程序终止的正常方式。

由于应用程序应该立即终止进程,我们使用SIGQUIT。

调整子进程的超时和缓冲区以使其完成也很重要。