我有 node.js休息服务器,我希望将其作为守护程序运行,使其在崩溃时重新生成。
我对unix的了解非常有限,所以我尝试了几个我在Google上找到的示例脚本。下面的那个似乎工作,除了它没有重新生成应用程序,当它崩溃并且大多数时间没有记录实际错误。
你能告诉我它有什么问题吗?
#my-app
description "node.js my-app"
env FULL_PATH="/home/ec2-user/rest-api"
env NODE_PATH="/usr/local/bin/node"
start on filesystem or runlevel [2345]
stop on [!2345]
script
export HOME="/ec2-user"
export NODE_ENV=development
echo $$ > /var/run/rest.pid
cd $FULL_PATH
exec $NODE_PATH index.js >> /var/log/rest.sys.log 2>&1
end script
pre-start script
echo "[`date`] (sys) Starting" >> /var/log/rest.sys.log
end script
pre-stop script
rm /var/run/rest.pid
echo "[`date`] (sys) Stopping" >> /var/log/rest.sys.log
end script
respawn limit 50 30
#respawn tried this as well with no success
我已将此代码放入 /etc/init/rest.conf
我正在运行它:
$ sudo start rest
rest start/running, process 7734
每次运行时,数字(7734)都不同,如果这有一定的重要性。
/var/log/rest.sys.log 中的日志有关于守护程序启动的输出:
[Mon Apr 20 22:32:18 UTC 2015] (sys) Starting
Express server listening on port 3000 in development mode
[Thu Apr 23 13:26:28 UTC 2015] (sys) Starting
Express server listening on port 3000 in development mode
然而,大多数时候它停止了,崩溃本身并没有什么,但在某些情况下它确实如此。例如,当mysql服务器关闭时,node.js应用程序停止并在/var/log/rest.sys.log中记录ECONNREFUSED错误
index.js:
var config = require('./config');
var domain = require('domain');
var d = domain.create();
var server = require('./server');
d.on('error', function(err) {
console.error(err);
});
d.run(function() {
server.start();
});
server.js
var express = require('express')
app = express(),
routes = require('./routes'),
fs = require('fs'),
bodyParser = require('body-parser'),
methodOverride = require('method-override'),
errorHandler = require('errorhandler'),
path = require("path"),
applicationRoot = __dirname,
router = express.Router(),
config = require('./config')
var winston = require('winston');
require('winston-papertrail').Papertrail;
var url = require('url');
var logger = new winston.Logger({
transports: [
new winston.transports.Papertrail({
host: xxx,
port: xxx
})
]
});
var db = require('./db')
app.use(bodyParser());
app.use(methodOverride());
app.use(express.static(path.join(applicationRoot, "public")));
app.use(errorHandler({ dumpExceptions: true, showStack: true }));
app.use('development', errorHandler({ dumpExceptions: true, showStack: true }));
app.use('production', errorHandler({ dumpExceptions: true, showStack: true }));
[...]
function start() {
var port = process.env.PORT || 3000;
app.listen(port);
console.log("Express server listening on port %d in %s mode", port, app.settings.env);
}
exports.start = start;
exports.app = app;
我的系统信息:
NAME="Amazon Linux AMI"
VERSION="2014.09"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2014.09"
PRETTY_NAME="Amazon Linux AMI 2014.09"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2014.09:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2014.09