Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过Debian上node.js中的引用变量停止子进程?_Javascript_Node.js_Socket.io_Child Process_Mplayer - Fatal编程技术网

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

Javascript 如何通过Debian上node.js中的引用变量停止子进程?,javascript,node.js,socket.io,child-process,mplayer,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

我已经设置了一个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]);
        };
    });
}

所以我认为我已经在正确的方向上取得了一些进展,现在我知道我有了正确的过程,mPlayer确实被中断了,但是新歌没有播放。

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

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

因为应用程序应该立即终止进程,所以我们使用SIGQUIT

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

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%