server.js 3.1 KB

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