index 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/usr/bin/env node
  2. /**
  3. * Module dependencies.
  4. */
  5. // require('v8').setFlagsFromString('--harmony_async_await');
  6. const app = require('./app.js');
  7. const http = require('http');
  8. // const cluster = require('express-cluster');
  9. // const numCPUs = require('os').cpus().length;
  10. const colors = require('colors'),
  11. portfinder = require('portfinder'),
  12. opener = require('opener'),
  13. argv = require('optimist')
  14. .boolean('cors')
  15. .argv;
  16. const 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. // let exec = require('child_process').exec;
  60. // let 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. let 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 || '10001';
  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. let port = normalizePort(process.env.lrs_PORT);
  103. app.set('port', port);
  104. // cluster(function(worker) {
  105. /**
  106. * Create HTTP server.
  107. */
  108. let server = http.createServer(app);
  109. /**
  110. * Event listener for HTTP server "listening" event.
  111. */
  112. function onListening() {
  113. let addr = server.address();
  114. let bind = typeof addr === 'string'
  115. ? 'pipe ' + addr
  116. : 'port ' + addr.port;
  117. console.log('Listening on ' + bind);
  118. }
  119. /**
  120. * Listen on provided port, on all network interfaces.
  121. */
  122. server.on('error', onError);
  123. server.on('listening', onListening);
  124. server.listen(port);
  125. // return server.listen(port);
  126. // }, {count: 3})
  127. // 保存当前进程id
  128. if (process.pid) {
  129. console.log('<基因检测实验室管理系统>服务集群已启动,主进程id是:' + process.pid);
  130. fs.writeFileSync(__dirname + '/PROCESS_ID', process.pid);
  131. }
  132. /**
  133. * Normalize a port into a number, string, or false.
  134. */
  135. function normalizePort(val) {
  136. let port = parseInt(val, 10);
  137. if (isNaN(port)) {
  138. // named pipe
  139. return val;
  140. }
  141. if (port >= 0) {
  142. // port number
  143. return port;
  144. }
  145. return false;
  146. }
  147. /**
  148. * Event listener for HTTP server "error" event.
  149. */
  150. function onError(error) {
  151. if (error.syscall !== 'listen') {
  152. throw error;
  153. }
  154. let bind = typeof port === 'string'
  155. ? 'Pipe ' + port
  156. : 'Port ' + port;
  157. // handle specific listen errors with friendly messages
  158. switch (error.code) {
  159. case 'EACCES':
  160. console.error(bind + ' requires elevated privileges');
  161. process.exit(1);
  162. break;
  163. case 'EADDRINUSE':
  164. console.error(bind + ' is already in use');
  165. process.exit(1);
  166. break;
  167. default:
  168. throw error;
  169. }
  170. }