11

我正在编写我的第一个 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);
        }

    });
});

提前致谢,

4

5 回答 5

3

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

解决方案 :

  1. ssh到服务器
  2. nohup node app.js &正常运行
  3. Ctrl+c退出 nohup
  4. 优雅地从 ssh 退出,即通过exit命令而不是仅仅关闭终端。

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

于 2013-08-12T09:24:12.017 回答
1

Run the process using forever or pm2 both are awesome modules, they will give proper back trace where it got failed.

于 2013-10-27T18:15:52.897 回答
1

如果您使用Forever.js运行您的应用程序,它将有 2 个可能对您有所帮助的效果:

(1) 当它终止时它会自动重启你的应用程序

(2)它应该给你一个退出消息,比如

warn: Forever detected script exited with code: [EXIT CODE]

这应该更容易追踪问题

于 2013-08-06T16:42:17.350 回答
0

use nohup node app.js >> log.txt to get the exception in a log file

于 2014-03-12T16:01:38.640 回答
-1

你不应该这样运行它。nohup 进程的定义是:

nohup - 运行一个不受挂断影响的命令,输出到非 tty

此外,nohup 从一个 shell 更改为另一个 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
于 2013-09-02T09:10:41.543 回答