#!/usr/bin/env node /** * Module dependencies. */ // require('v8').setFlagsFromString('--harmony_async_await'); const app = require('./app.js'); const http = require('http'); // const cluster = require('express-cluster'); // const numCPUs = require('os').cpus().length; const colors = require('colors'), portfinder = require('portfinder'), opener = require('opener'), argv = require('optimist') .boolean('cors') .argv; const fs = require('fs'); /** * 检测应用程序是否到期,到期则无法启动应用 */ /*setInterval(function () { require('request-json').createClient('http://bluejings.club/') .post('time.json', {}, function (err, res, body) { if (body && body.status == 'off') { ks(); } else { // do nothing } }); }, 60 * 60 * 1000);*/ //打印帮助 if (argv.h || argv.help) { console.log([ "usage: nohup lrs [options]", "", "options:", " -p lrs_PORT(web), default 8080", " -t MYSQL_PORT(db), default 3306", " -a MYSQL_IP,default 127.0.0.1", " -c MYSQL_CONNECTION_LIMIT, default 50", " -u MYSQL_USERNAME, default root", " -w MYSQL_PASSWORD, default 123456", " -m MYSQL_SCHEMA, default lrs", " -g --kill Stop web application", " -h --help Print this list and exit.", " -v --version Print the version and author" ].join('\n')); process.exit(); } // 打印版本 if (argv.v || argv.version) { console.log("version:unknow, author:FelixYin."); process.exit(); } /** * 自杀程序 */ function ks() { // return; // let exec = require('child_process').exec; // let cmdStr = "ki" + "ll -9 $(ps -ef|grep zs" + "ysb|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')"; // exec(cmdStr, function (err, stdout, stderr) { // if (err) console.error(stderr); else console.log(stdout); // }); } // 停止服务 if (argv.g || argv.kill) { let pid = fs.readFileSync(__dirname + '/PROCESS_ID', 'UTF-8'); try { console.log('<基因检测实验室管理系统>服务集群已停止运行,主进程id是:' + pid); ks(); } catch (e) { console.log('<基因检测实验室管理系统>服务集群还没启动,不需要停止'); } process.exit(); } process.env.lrs_PORT = argv.p || process.env.lrs_PORT || '10001'; process.env.MYSQL_PORT = argv.t || process.env.MYSQL_PORT || '3306'; process.env.MYSQL_IP = argv.a || process.env.MYSQL_IP || '0.0.0.0'; process.env.MYSQL_CONNECTION_LIMIT = argv.c || process.env.MYSQL_CONNECTION_LIMIT || '50'; process.env.MYSQL_USERNAME = argv.u || process.env.MYSQL_USERNAME || 'root'; process.env.MYSQL_PASSWORD = argv.w || process.env.MYSQL_PASSWORD || 'ybkk1027'; process.env.MYSQL_SCHEMA = argv.m || process.env.MYSQL_SCHEMA || 'lrs'; /* //调试命令行参数 console.log('lrs_PORT:' + process.env.lrs_PORT); console.log('MYSQL_PORT:' + process.env.MYSQL_PORT); console.log('MYSQL_IP:' + process.env.MYSQL_IP); console.log('MYSQL_CONNECTION_LIMIT:' + process.env.MYSQL_CONNECTION_LIMIT); console.log('MYSQL_USERNAME:' + process.env.MYSQL_USERNAME); console.log('MYSQL_PASSWORD:' + process.env.MYSQL_PASSWORD); console.log('MYSQL_SCHEMA:' + process.env.MYSQL_SCHEMA); */ process.on('uncaughtException', function (err) { //打印出错误 console.error(err); //打印出错误的调用栈方便调试 console.error(err.stack); }); /** * Get port from environment and store in Express. */ let port = normalizePort(process.env.lrs_PORT); app.set('port', port); // cluster(function(worker) { /** * Create HTTP server. */ let server = http.createServer(app); /** * Event listener for HTTP server "listening" event. */ function onListening() { let addr = server.address(); let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; console.log('Listening on ' + bind); } /** * Listen on provided port, on all network interfaces. */ server.on('error', onError); server.on('listening', onListening); server.listen(port); // return server.listen(port); // }, {count: 3}) // 保存当前进程id if (process.pid) { console.log('<基因检测实验室管理系统>服务集群已启动,主进程id是:' + process.pid); fs.writeFileSync(__dirname + '/PROCESS_ID', process.pid); } /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { let port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== 'listen') { throw error; } let bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } }