index 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #!/usr/bin/env node
  2. /**
  3. * Module dependencies.
  4. */
  5. var app = require('./app.js');
  6. var debug = require('debug')('lrs:server');
  7. var http = require('http');
  8. var cluster = require('express-cluster');
  9. var numCPUs = require('os').cpus().length;
  10. var colors = require('colors'),
  11. portfinder = require('portfinder'),
  12. opener = require('opener'),
  13. argv = require('optimist')
  14. .boolean('cors')
  15. .argv;
  16. var fs = require('fs');
  17. /**
  18. * 检测应用程序是否到期,到期则无法启动应用
  19. */
  20. /*setInterval(function () {
  21. require('request-json').createClient('http://bluejings.club/')
  22. .post('time.json', {}, function (err, res, body) {
  23. if (body && body.status == 'off') {
  24. ks();
  25. } else {
  26. // do nothing
  27. }
  28. });
  29. }, 60 * 60 * 1000);*/
  30. //打印帮助
  31. if (argv.h || argv.help) {
  32. console.log([
  33. "usage: nohup lrs [options]",
  34. "",
  35. "options:",
  36. " -p lrs_PORT(web), default 8080",
  37. " -t MYSQL_PORT(db), default 3306",
  38. " -a MYSQL_IP,default 127.0.0.1",
  39. " -c MYSQL_CONNECTION_LIMIT, default 50",
  40. " -u MYSQL_USERNAME, default root",
  41. " -w MYSQL_PASSWORD, default 123456",
  42. " -m MYSQL_SCHEMA, default lrs",
  43. " -g --kill Stop web application",
  44. " -h --help Print this list and exit.",
  45. " -v --version Print the version and author"
  46. ].join('\n'));
  47. process.exit();
  48. }
  49. // 打印版本
  50. if (argv.v || argv.version) {
  51. console.log("version:unknow, author:FelixYin.");
  52. process.exit();
  53. }
  54. /**
  55. * 自杀程序
  56. */
  57. function ks() {
  58. return;
  59. var exec = require('child_process').exec;
  60. var cmdStr = "ki" + "ll -9 $(ps -ef|grep zs" + "ysb|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')";
  61. exec(cmdStr, function (err, stdout, stderr) {
  62. if (err) console.error(stderr); else console.log(stdout);
  63. });
  64. }
  65. // 停止服务
  66. if (argv.g || argv.kill) {
  67. var pid = fs.readFileSync(__dirname + '/PROCESS_ID', 'UTF-8');
  68. try {
  69. console.log('<狼人杀游戏系统>服务集群已停止运行,主进程id是:' + pid);
  70. ks();
  71. } catch (e) {
  72. console.log('<狼人杀游戏系统>服务集群还没启动,不需要停止');
  73. }
  74. process.exit();
  75. }
  76. process.env.lrs_PORT = argv.p || process.env.lrs_PORT || '8080';
  77. process.env.MYSQL_PORT = argv.t || process.env.MYSQL_PORT || '3306';
  78. process.env.MYSQL_IP = argv.a || process.env.MYSQL_IP || '0.0.0.0';
  79. process.env.MYSQL_CONNECTION_LIMIT = argv.c || process.env.MYSQL_CONNECTION_LIMIT || '50';
  80. process.env.MYSQL_USERNAME = argv.u || process.env.MYSQL_USERNAME || 'root';
  81. process.env.MYSQL_PASSWORD = argv.w || process.env.MYSQL_PASSWORD || 'ybkk1027';
  82. process.env.MYSQL_SCHEMA = argv.m || process.env.MYSQL_SCHEMA || 'lrs';
  83. /*
  84. //调试命令行参数
  85. console.log('lrs_PORT:' + process.env.lrs_PORT);
  86. console.log('MYSQL_PORT:' + process.env.MYSQL_PORT);
  87. console.log('MYSQL_IP:' + process.env.MYSQL_IP);
  88. console.log('MYSQL_CONNECTION_LIMIT:' + process.env.MYSQL_CONNECTION_LIMIT);
  89. console.log('MYSQL_USERNAME:' + process.env.MYSQL_USERNAME);
  90. console.log('MYSQL_PASSWORD:' + process.env.MYSQL_PASSWORD);
  91. console.log('MYSQL_SCHEMA:' + process.env.MYSQL_SCHEMA);
  92. */
  93. process.on('uncaughtException', function (err) {
  94. //打印出错误
  95. console.error(err);
  96. //打印出错误的调用栈方便调试
  97. console.error(err.stack);
  98. });
  99. /**
  100. * Get port from environment and store in Express.
  101. */
  102. var port = normalizePort(process.env.lrs_PORT);
  103. app.set('port', port);
  104. /**
  105. * Create HTTP server.
  106. */
  107. var server = http.createServer(app);
  108. /**
  109. * Event listener for HTTP server "listening" event.
  110. */
  111. function onListening() {
  112. var addr = server.address();
  113. var bind = typeof addr === 'string'
  114. ? 'pipe ' + addr
  115. : 'port ' + addr.port;
  116. debug('Listening on ' + bind);
  117. }
  118. /**
  119. * Listen on provided port, on all network interfaces.
  120. */
  121. server.listen(port);
  122. server.on('error', onError);
  123. server.on('listening', onListening);
  124. // 保存当前进程id
  125. if (process.pid) {
  126. console.log('<大云益健移动系统后台>服务集群已启动,主进程id是:' + process.pid);
  127. fs.writeFileSync(__dirname + '/PROCESS_ID', process.pid);
  128. }
  129. /**
  130. * Normalize a port into a number, string, or false.
  131. */
  132. function normalizePort(val) {
  133. var port = parseInt(val, 10);
  134. if (isNaN(port)) {
  135. // named pipe
  136. return val;
  137. }
  138. if (port >= 0) {
  139. // port number
  140. return port;
  141. }
  142. return false;
  143. }
  144. /**
  145. * Event listener for HTTP server "error" event.
  146. */
  147. function onError(error) {
  148. if (error.syscall !== 'listen') {
  149. throw error;
  150. }
  151. var bind = typeof port === 'string'
  152. ? 'Pipe ' + port
  153. : 'Port ' + port;
  154. // handle specific listen errors with friendly messages
  155. switch (error.code) {
  156. case 'EACCES':
  157. console.error(bind + ' requires elevated privileges');
  158. process.exit(1);
  159. break;
  160. case 'EADDRINUSE':
  161. console.error(bind + ' is already in use');
  162. process.exit(1);
  163. break;
  164. default:
  165. throw error;
  166. }
  167. }