Nodejs的nohup没有异常而死亡

12

我正在编写我的第一个NodeJS应用程序,但由于某种原因,它在短时间内似乎会意外死亡。我不知道是什么原因导致的。该进程运行良好,甚至按预期工作,然后由于某种原因它就停止了。nohup日志没有显示错误或任何反馈。

我尝试在调试模式下运行它,但情况相同,没有信息。跟踪也没有帮助。

我通过nohup运行进程:

nohup node app.js &

代码:

var http = require('http');
var server = http.createServer().listen(8000);
var io = require('socket.io').listen(server);
var cookie_reader = require('cookie');
var querystring = require('querystring');

// Store the session cookie set by Django
io.configure(function(){
    io.set('authorization', function(data, accept){
        if(data.headers.cookie){
            data.cookie = cookie_reader.parse(data.headers.cookie);
            return accept(null, true);
        }
        return accept('error', false);
    });
    io.set('log level', 1);
});

io.sockets.on('connection', function (socket) {
    socket.on('shoutbox_send', function(message){

        values = querystring.stringify({
            comment: message,
            sessionid: socket.handshake.cookie['sessionid'],
        });

        try {
            var options = {
                host: 'www.example.com',
                port: 80,
                path: '/shoutbox/node_api',
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Content-Length': values.length
                }
            };

            var req = http.get(options, function(res){
                res.setEncoding('utf8');
                res.on('data', function(message){
                    socket.emit('shoutbox_receive', message);
                    socket.broadcast.emit('shoutbox_receive', message);
                });
            });

            req.write(values);
            req.end();
        } catch (err) {
            console.log(err);
            socket.emit('shoutbox_receive', err);
        }

    });
});

提前感谢您,


这与Django有什么关系? - Games Brainiac
它是POST目的地。 - Lee
nohup.out 显示了什么?你的应用程序在被杀死之前需要多长时间? - user568109
2
你可以尝试使用screen代替nohup。screen从shell中运行,只需输入screen即可。然后你就进入了一个新的shell,除了终端输出以一种可能有用的方式被重定向之外。你可以使用Control A Control D分离屏幕,而其中运行的进程仍在继续,并且有一个虚拟终端来打印错误或信息。稍后你可以使用screen -R从不同的会话重新连接。 - Paul
你尝试在另一台机器上运行你的node.js应用了吗?由于某些原因,操作系统可能会杀死这个node进程。 - Aurélien Gasser
显示剩余8条评论
5个回答

4

我遇到了类似的问题(但不知道是否有共同的原因)。

解决方案:

  1. ssh进入服务器。
  2. 像平常一样运行nohup node app.js &
  3. 使用Ctrl+c退出nohup。
  4. 优雅地从ssh中退出,即通过exit命令而不是只关闭终端。

最后一点非常重要,我没有正确地退出ssh,因此它被杀死了。


如果您在命令后添加'&'来将其作为服务启动,则它不会停止。 - Varun Oberoi
添加&是可以的(不要忘记) - Can Aksoy

1
如果您使用Forever.js运行您的应用程序,它将产生两个可能对您有帮助的效果:
(1)当应用程序终止时,它将自动重新启动您的应用程序。
(2)它应该会给您一个退出消息,例如:
warn: Forever detected script exited with code: [EXIT CODE]

这应该会让问题追踪更容易


1

使用forever或pm2运行该进程,这两个模块都很棒,它们会提供适当的回溯信息以确定失败的原因。


0

使用 nohup node app.js >> log.txt 将异常信息输出到日志文件中


-1

你不应该以这种方式运行它。 nohup进程的定义是:

nohup - 运行一个免受挂起影响的命令,并将输出发送到非tty

此外,nohup在不同的shell之间进行更改,基本上意味着在不同的Linux发行版上,此进程的行为不同。

你应该像我在我们公司的服务器上那样运行它:

/usr/local/bin/node app.js > /var/log/node_js.log 2>&1

然后按:

Ctrl-Z

然后输入:

bg

该进程将在后台运行,并将其错误和输出日志输出到/var/log/node_js.log文件。如果它失败了,您将在该文件中看到失败原因。
您可以定期使用以下命令退出ssh会话:
exit

你似乎不理解 nohup 的作用,也没有解释为什么你认为它不好,并且你提出的方法过于复杂,而且容易出现 nohup 本来就想要解决的问题。 - wfaulk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接