HTTP 服务器在一段时间后停止(Node.js)

Posted

技术标签:

【中文标题】HTTP 服务器在一段时间后停止(Node.js)【英文标题】:HTTP Server stops after some time (Node.js) 【发布时间】:2016-05-10 17:12:51 【问题描述】:

INFO: 我指的是this我在超级用户上提出的问题,但无法得到答案,我认为这是一个很好的提问地方,因为问题可能与代码有关。

我目前在我的 RaspberryPi 上运行一个带有 express.js 的简单 Node.JS 服务器,并在其上安装了 Debian。一切正常,但每天早上我醒来发现我的服务器不再运行(我使用命令 node main.js 启动的服务器进程)。

我的第一个猜测是,Pi 有某种睡眠模式,它在几个小时没有流量/等的情况下进入,并关闭服务器,但我还运行了一个 dydns-client,它仍然是每天早上起床(我还被告知,RaspberryPi 没有睡眠模式)。

我写了一个简单的脚本来检查进程是否正在运行并将它写入一个日志文件,但是今天早上我不得不注意到,这个脚本没有运行好(只运行了大约两个小时,它记录了服务器状态每 15 秒一次,最后一个状态是 running)。

这是脚本:

#!/bin/sh                                                                                                                                     

MATCH="SOME_PROCESS_NAME"                                                                                                

while [ true ]                                                                                                                                
 do                                                                                                                                            
   if [ "$(ps -ef | grep $MATCH | grep -v grep)" ]; then                                                                                     
     echo "$(date): Process is running ..."                                                                                                    
   else                                                                                                                                        
     echo "$(date): Process has ended ..."                                                                                                                                                                                                                    
   fi                                                                                                                                          

   sleep 15                                                                                                                                     
done 

有没有办法在我明天早上启动进程后跟踪它,检查是什么杀死了我的进程或它结束的原因(脚本显然不起作用)?

服务器本身看起来很简单,我不认为我错过了某种自动关闭。这是我使用的代码。

var express = require('express');
var path    = require('path');

var server  = express();
server.use(express.static(path.join(__dirname, 'public')));

server.listen(1337);
console.log("Server listening (PORT: " + 1337 + ") ...");

知道该怎么做,以保持服务器运行/找出停止原因是什么?

更新:我在RaspberryPi-stackexchange 收到了一个有效的答案。

【问题讨论】:

您是如何开始这些流程的?听起来他们可能会被SIGHUP 杀死。 @robertklep 是的,我在RaspberryPi.stackexchange 得到了类似的答案,我现在正在测试它:) 【参考方案1】:

我的猜测是 Raspberry Pi 在午夜或类似的时候重新启动。要解决此问题,可能会为您的服务器进程 rc.local 文件添加一个条目。您可以通过编辑 /etc/rc.local 将命令添加到 rc.local 文件中

【讨论】:

为什么树莓派会在午夜重启? @LastSecondsToLive 我不知道。可能是定时省电,也可能只是同步系统的东西,我不知道。也许创建一个脚本每分钟将时间写入文件,然后它会在关闭时自动停止。【参考方案2】:

这对https://raspberrypi.stackexchange.com/questions/8741/when-does-the-os-kill-an-application 有帮助吗?

我想建议一种不同的方法来监控您的流程,直到您可以获得更多信息、编辑、检查、然后开始(即时编写)

var fs = require('fs')
var spawn = require('child_process');

var child = spawn(process.argv[0], 'your/bin.js', stdio:['ignore', 'pipe', 'pipe'])

child.stdout.pipe(fs.createReadStream('stdout.log'))
child.stderr.pipe(fs.createReadStream('stderr.log'))
child.on('error', function (err) 
  fs.writeFile('error.log', JSON.stringify(err), function ()  /* void */ )
)
child.on('close', function (code, signal) 
  fs.writeFile('exit.log', "code="+code+" signal="+signal, function ()  /* void */ )
)

【讨论】:

以上是关于HTTP 服务器在一段时间后停止(Node.js)的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot REST服务在一段时间后停止

我在我的 Node.js 应用程序中使用 MongoSkin,在一段时间不活动后,它失去了与数据库的连接

GPS跟踪的前台服务在一段时间后停止工作

NodeJS - MySQL 服务器在一段时间后无法工作

如何在一段时间后或每次我对文件进行更改时停止 npm start?

按钮声音在一段时间后停止