server.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. const _ = require("lodash");
  2. const assert = require("assert");
  3. const fs = require("fs");
  4. const path = require("path");
  5. const { exec, execSync } = require("child_process");
  6. const ps = require("./ps");
  7. const Log = require('ee-core/log');
  8. const is = require('ee-core/utils/is');
  9. const UtilsPs = require('ee-core/ps');
  10. /**
  11. * java server
  12. */
  13. class JavaServer {
  14. constructor () {
  15. this.options;
  16. }
  17. /**
  18. * 创建服务
  19. */
  20. async create (cfg) {
  21. this.options = cfg;
  22. if (this.options.enable == false) {
  23. return;
  24. }
  25. let port = process.env.EE_JAVA_PORT ? parseInt(process.env.EE_JAVA_PORT) : parseInt(this.options.port);
  26. assert(typeof port === "number", "java port required, and must be a number");
  27. try {
  28. const jarName = this.options.name;
  29. let softwarePath = path.join(UtilsPs.getExtraResourcesDir(), jarName);
  30. let javaOptStr = this.options.opt;
  31. let jrePath = path.join(UtilsPs.getExtraResourcesDir(), this.options.jreVersion);
  32. let cmdStr = '';
  33. Log.info("[addon:javaServer] jar file path:", softwarePath);
  34. if (!fs.existsSync(softwarePath)) throw new Error('java program does not exist');
  35. // 替换opt参数
  36. javaOptStr = _.replace(javaOptStr, "${port}", port);
  37. javaOptStr = _.replace(javaOptStr, "${path}", UtilsPs.getLogDir());
  38. if (is.windows()) {
  39. jrePath = path.join(jrePath, "bin", "javaw.exe");
  40. cmdStr = `start ${jrePath} -jar ${javaOptStr} ${softwarePath}`;
  41. } else if (is.macOS()) {
  42. // 如果提示:不受信任,请执行: sudo spctl --master-disable
  43. jrePath = path.join(jrePath, "Contents", "Home", "bin", "java");
  44. //cmdStr = `nohup ${jrePath} -jar ${javaOptStr} ${softwarePath} >/dev/null 2>&1 &`;
  45. cmdStr = `${jrePath} -jar ${javaOptStr} ${softwarePath}`;
  46. } else {
  47. // todo linux
  48. }
  49. Log.info("[addon:javaServer] cmdStr:", cmdStr);
  50. exec(cmdStr);
  51. } catch (err) {
  52. Log.error('[addon:javaServer] throw error:', err);
  53. }
  54. }
  55. /**
  56. * 关闭服务
  57. */
  58. async kill () {
  59. const jarName = this.options.name;
  60. if (is.windows()) {
  61. const resultList = ps.lookup({
  62. command: "java",
  63. where: 'caption="javaw.exe"',
  64. arguments: jarName,
  65. });
  66. //Log.info("[addon:javaServer] resultList:", resultList);
  67. resultList.forEach((item) => {
  68. ps.kill(item.pid, "SIGKILL", (err) => {
  69. if (err) {
  70. throw new Error(err);
  71. }
  72. Log.info("[addon:javaServer] java程序退出 pid: ", item.pid);
  73. });
  74. });
  75. // const cmd = `for /f "tokens=1-5" %i in ('netstat -ano ^| findstr ":${port}"') do taskkill /F /T /PID %m`;
  76. // const a = await execSync(cmd, {encoding: 'utf-8'});
  77. // Log.info("[javaServer] kill:", a);
  78. } else if (is.macOS()) {
  79. const cmd = `ps -ef | grep java | grep ${jarName} | grep -v grep | awk '{print $2}' | xargs kill -9`;
  80. const result = await execSync(cmd);
  81. Log.info("[addon:javaServer] kill:", result != null ? result.toString(): '');
  82. } else {
  83. // todo linux
  84. }
  85. }
  86. /**
  87. * 服务是否运行中
  88. */
  89. async isRun(cfg){
  90. const jarName = cfg.name;
  91. if (is.windows()) {
  92. const resultList = ps.lookup({
  93. command: "java",
  94. where: 'caption="javaw.exe"',
  95. arguments: jarName,
  96. });
  97. Log.info("[addon:javaServer] resultList:", resultList);
  98. return resultList.length>0;
  99. } else if (is.macOS()) {
  100. const cmd = `ps -ef | grep java | grep ${jarName} | grep -v grep | awk '{print $2}' `;
  101. Log.info("[addon:javaServer:isRun] cmdStr:", cmd);
  102. const result = execSync(cmd);
  103. Log.info('[addon:javaServer:isRun] result:', result.toString());
  104. //不等于空说明正在运行
  105. return result.toString()!==""
  106. } else {
  107. // todo linux
  108. }
  109. }
  110. }
  111. module.exports = JavaServer;