mirror of
https://gitee.com/dromara/electron-egg.git
synced 2026-05-15 04:02:10 +08:00
100 lines
3.1 KiB
JavaScript
100 lines
3.1 KiB
JavaScript
const _ = require("lodash");
|
|
const assert = require("assert");
|
|
const fs = require("fs");
|
|
const is = require('electron-is');
|
|
const path = require("path");
|
|
const { exec, execSync } = require("child_process");
|
|
const Utils = require("ee-core").Utils;
|
|
const ps = require("./ps");
|
|
const Log = require('ee-core/log');
|
|
|
|
/**
|
|
* java server
|
|
*/
|
|
class JavaServer {
|
|
constructor (app) {
|
|
this.app = app;
|
|
this.options = app.config.addons.javaServer;
|
|
}
|
|
|
|
/**
|
|
* 创建服务
|
|
*/
|
|
async create () {
|
|
if (!this.options.enable) {
|
|
return;
|
|
}
|
|
|
|
let port = process.env.EE_JAVA_PORT ? parseInt(process.env.EE_JAVA_PORT) : parseInt(this.options.port);
|
|
assert(typeof port === "number", "java port required, and must be a number");
|
|
|
|
try {
|
|
const jarName = this.options.name;
|
|
let softwarePath = path.join(Utils.getExtraResourcesDir(), jarName);
|
|
let javaOptStr = this.options.opt;
|
|
let jrePath = path.join(Utils.getExtraResourcesDir(), this.options.jreVersion);
|
|
let cmdStr = '';
|
|
|
|
this.app.console.info("[addon:javaServer] jar file path:", softwarePath);
|
|
if (!fs.existsSync(softwarePath)) throw new Error('java program does not exist');
|
|
|
|
// 替换opt参数
|
|
javaOptStr = _.replace(javaOptStr, "${port}", port);
|
|
javaOptStr = _.replace(javaOptStr, "${path}", Utils.getLogDir());
|
|
|
|
if (is.windows()) {
|
|
jrePath = path.join(jrePath, "bin", "javaw.exe");
|
|
cmdStr = `start ${jrePath} -jar ${javaOptStr} ${softwarePath}`;
|
|
} else if (is.macOS()) {
|
|
// 如果提示:不受信任,请执行: sudo spctl --master-disable
|
|
jrePath = path.join(jrePath, "Contents", "Home", "bin", "java");
|
|
//cmdStr = `nohup ${jrePath} -jar ${javaOptStr} ${softwarePath} >/dev/null 2>&1 &`;
|
|
cmdStr = `${jrePath} -jar ${javaOptStr} ${softwarePath}`;
|
|
} else {
|
|
// todo linux
|
|
}
|
|
|
|
Log.info("[addon:javaServer] cmdStr:", cmdStr);
|
|
exec(cmdStr);
|
|
|
|
} catch (err) {
|
|
Log.error('[addon:javaServer] throw error:', err);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 关闭服务
|
|
*/
|
|
async kill () {
|
|
const jarName = this.options.name;
|
|
if (is.windows()) {
|
|
const resultList = ps.lookup({
|
|
command: "java",
|
|
where: 'caption="javaw.exe"',
|
|
arguments: jarName,
|
|
});
|
|
|
|
//Log.info("[addon:javaServer] resultList:", resultList);
|
|
resultList.forEach((item) => {
|
|
ps.kill(item.pid, "SIGKILL", (err) => {
|
|
if (err) {
|
|
throw new Error(err);
|
|
}
|
|
console.info("[addon:javaServer] java程序退出 pid: ", item.pid);
|
|
});
|
|
});
|
|
|
|
// const cmd = `for /f "tokens=1-5" %i in ('netstat -ano ^| findstr ":${port}"') do taskkill /F /T /PID %m`;
|
|
// const a = await execSync(cmd, {encoding: 'utf-8'});
|
|
// Log.info("[javaServer] kill:", a);
|
|
} else if (is.macOS()) {
|
|
const cmd = `ps -ef | grep java | grep ${jarName} | grep -v grep | awk '{print $2}' | xargs kill -9`;
|
|
const result = await execSync(cmd);
|
|
Log.info("[addon:javaServer] kill:", result != null ? result.toString(): '');
|
|
} else {
|
|
// todo linux
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = JavaServer; |