server.js 3.1 KB

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