|
|
@ -3,13 +3,13 @@ const path = require("path");
|
|
|
|
const { app } = require("electron");
|
|
|
|
const { app } = require("electron");
|
|
|
|
const { spawn, exec } = require("child_process");
|
|
|
|
const { spawn, exec } = require("child_process");
|
|
|
|
|
|
|
|
|
|
|
|
// 进程引用管理
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
const processes = {
|
|
|
|
const processes = {
|
|
|
|
LiveTalkingProcess: null,
|
|
|
|
LiveTalkingProcess: null,
|
|
|
|
gptsovitsProcess: null,
|
|
|
|
gptsovitsProcess: null,
|
|
|
|
chatProcess: null
|
|
|
|
chatProcess: null
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// 获取数据库路径
|
|
|
|
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>·<EFBFBD><EFBFBD>
|
|
|
|
function getDatabasePath() {
|
|
|
|
function getDatabasePath() {
|
|
|
|
if (process.env.NODE_ENV === "development") {
|
|
|
|
if (process.env.NODE_ENV === "development") {
|
|
|
|
const dbPath = path.join(__dirname, "..", "..", "live_chat.db");
|
|
|
|
const dbPath = path.join(__dirname, "..", "..", "live_chat.db");
|
|
|
@ -17,28 +17,28 @@ function getDatabasePath() {
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
const exePath = app.getPath("exe");
|
|
|
|
const exePath = app.getPath("exe");
|
|
|
|
|
|
|
|
|
|
|
|
// 获取win-unpacked文件夹路径
|
|
|
|
// <EFBFBD><EFBFBD>ȡwin-unpacked<65>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
const winUnpackedDir = path.dirname(exePath);
|
|
|
|
const winUnpackedDir = path.dirname(exePath);
|
|
|
|
|
|
|
|
|
|
|
|
// 获取win-unpacked的上级目录(与win-unpacked同级的目录)
|
|
|
|
// <EFBFBD><EFBFBD>ȡwin-unpacked<65><64><EFBFBD>ϼ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>win-unpackedͬ<64><CDAC><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
|
|
|
|
const parentDir = path.dirname(winUnpackedDir);
|
|
|
|
const parentDir = path.dirname(winUnpackedDir);
|
|
|
|
|
|
|
|
|
|
|
|
// 构建live_chat.db的完整路径
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>live_chat.db<64><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
const dbPath = path.join(parentDir, "live_chat.db");
|
|
|
|
const dbPath = path.join(parentDir, "live_chat.db");
|
|
|
|
console.log("dbPath", dbPath);
|
|
|
|
console.log("dbPath", dbPath);
|
|
|
|
return dbPath;
|
|
|
|
return dbPath;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 更新配置值
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
function updateConfig(tableName, key, value) {
|
|
|
|
function updateConfig(tableName, key, value) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
|
if (err) {
|
|
|
|
if (err) {
|
|
|
|
console.error("数据库连接错误:", err.message);
|
|
|
|
console.error("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD>:", err.message);
|
|
|
|
return reject(err);
|
|
|
|
return reject(err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
// 先尝试更新,如果影响行数为0则插入新记录
|
|
|
|
// <EFBFBD>ȳ<EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>¼
|
|
|
|
db.run(
|
|
|
|
db.run(
|
|
|
|
`UPDATE ${tableName} SET value = ? WHERE key = ?`,
|
|
|
|
`UPDATE ${tableName} SET value = ? WHERE key = ?`,
|
|
|
|
[value, key],
|
|
|
|
[value, key],
|
|
|
@ -48,7 +48,7 @@ function updateConfig(tableName, key, value) {
|
|
|
|
return reject(err);
|
|
|
|
return reject(err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有匹配的记录则插入
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD>ļ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
if (this.changes === 0) {
|
|
|
|
if (this.changes === 0) {
|
|
|
|
db.run(
|
|
|
|
db.run(
|
|
|
|
`INSERT INTO ${tableName} (key, value) VALUES (?, ?)`,
|
|
|
|
`INSERT INTO ${tableName} (key, value) VALUES (?, ?)`,
|
|
|
@ -72,7 +72,7 @@ function updateConfig(tableName, key, value) {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取配置值
|
|
|
|
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
function getConfigValue(tableName, key) {
|
|
|
|
function getConfigValue(tableName, key) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
@ -92,12 +92,44 @@ function getConfigValue(tableName, key) {
|
|
|
|
);
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 批量插入系统消息
|
|
|
|
function getAllSystemMessages() {
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
|
|
// 连接数据库
|
|
|
|
|
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
|
|
|
|
|
if (err) {
|
|
|
|
|
|
|
|
console.error("数据库连接错误:", err.message);
|
|
|
|
|
|
|
|
return reject(err);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log("成功连接到数据库");
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 执行查询
|
|
|
|
|
|
|
|
const sql = "SELECT message FROM system_message";
|
|
|
|
|
|
|
|
db.all(sql, [], (err, rows) => {
|
|
|
|
|
|
|
|
// 关闭数据库连接
|
|
|
|
|
|
|
|
db.close(closeErr => {
|
|
|
|
|
|
|
|
if (closeErr) {
|
|
|
|
|
|
|
|
console.error("关闭数据库错误:", closeErr.message);
|
|
|
|
|
|
|
|
return reject(closeErr);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (err) {
|
|
|
|
|
|
|
|
console.error("查询错误:", err.message);
|
|
|
|
|
|
|
|
return reject(err);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 提取所有message字段
|
|
|
|
|
|
|
|
const messages = rows.map(row => row.message);
|
|
|
|
|
|
|
|
resolve(messages);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>Ϣ
|
|
|
|
const bulkInsertSystemMessages = messages => {
|
|
|
|
const bulkInsertSystemMessages = messages => {
|
|
|
|
console.log("系统消息:", messages);
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
if (!Array.isArray(messages) || messages.length === 0) {
|
|
|
|
if (!Array.isArray(messages) || messages.length === 0) {
|
|
|
|
reject(new Error("请提供有效的消息数组"));
|
|
|
|
reject(new Error("<EFBFBD><EFBFBD><EFBFBD>ṩ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -108,7 +140,7 @@ const bulkInsertSystemMessages = messages => {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用事务进行批量插入,提高性能
|
|
|
|
// ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
db.run("BEGIN TRANSACTION", err => {
|
|
|
|
db.run("BEGIN TRANSACTION", err => {
|
|
|
|
if (err) {
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
reject(err);
|
|
|
@ -130,7 +162,7 @@ const bulkInsertSystemMessages = messages => {
|
|
|
|
|
|
|
|
|
|
|
|
completed++;
|
|
|
|
completed++;
|
|
|
|
|
|
|
|
|
|
|
|
// 所有消息都处理完毕
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
if (completed === messages.length) {
|
|
|
|
if (completed === messages.length) {
|
|
|
|
stmt.finalize();
|
|
|
|
stmt.finalize();
|
|
|
|
|
|
|
|
|
|
|
@ -162,7 +194,7 @@ const bulkInsertSystemMessages = messages => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// 清空系统消息表
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>
|
|
|
|
const clearSystemMessages = () => {
|
|
|
|
const clearSystemMessages = () => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
@ -171,7 +203,7 @@ const clearSystemMessages = () => {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用TRUNCATE-like操作清空表,同时重置自增ID
|
|
|
|
// ʹ<EFBFBD><EFBFBD>TRUNCATE-like<6B><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
|
|
|
|
db.run("DELETE FROM system_message", err => {
|
|
|
|
db.run("DELETE FROM system_message", err => {
|
|
|
|
if (err) {
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
reject(err);
|
|
|
@ -179,7 +211,7 @@ const clearSystemMessages = () => {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 重置自增计数器(SQLite特定)
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SQLite<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
db.run(
|
|
|
|
db.run(
|
|
|
|
"DELETE FROM sqlite_sequence WHERE name = 'system_message'",
|
|
|
|
"DELETE FROM sqlite_sequence WHERE name = 'system_message'",
|
|
|
|
err => {
|
|
|
|
err => {
|
|
|
@ -198,31 +230,31 @@ const clearSystemMessages = () => {
|
|
|
|
function getProcessExePath(fileName, exeName) {
|
|
|
|
function getProcessExePath(fileName, exeName) {
|
|
|
|
let exePath;
|
|
|
|
let exePath;
|
|
|
|
let exeFolder;
|
|
|
|
let exeFolder;
|
|
|
|
// 判断是否为开发环境
|
|
|
|
// <EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
if (process.env.NODE_ENV === "development") {
|
|
|
|
if (process.env.NODE_ENV === "development") {
|
|
|
|
// process.cwd() 通常指向项目根目录
|
|
|
|
// process.cwd() ͨ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>Ŀ¼
|
|
|
|
const projectRoot = process.cwd();
|
|
|
|
const projectRoot = process.cwd();
|
|
|
|
const parentDir = path.dirname(projectRoot);
|
|
|
|
const parentDir = path.dirname(projectRoot);
|
|
|
|
exePath = path.join(parentDir, fileName, exeName);
|
|
|
|
exePath = path.join(parentDir, fileName, exeName);
|
|
|
|
exeFolder = path.join(parentDir, fileName);
|
|
|
|
exeFolder = path.join(parentDir, fileName);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
// 生产环境: 与win-unpacked同级目录下的LiveTalking文件夹
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>win-unpackedͬ<64><CDAC>Ŀ¼<C4BF>µ<EFBFBD>LiveTalking<6E>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
exePath = app.getPath("exe");
|
|
|
|
exePath = app.getPath("exe");
|
|
|
|
// 获取win-unpacked文件夹路径
|
|
|
|
// <EFBFBD><EFBFBD>ȡwin-unpacked<65>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
const winUnpackedDir = path.dirname(exePath);
|
|
|
|
const winUnpackedDir = path.dirname(exePath);
|
|
|
|
// 获取win-unpacked的上级目录
|
|
|
|
// <EFBFBD><EFBFBD>ȡwin-unpacked<65><64><EFBFBD>ϼ<EFBFBD>Ŀ¼
|
|
|
|
const parentDir = path.dirname(winUnpackedDir);
|
|
|
|
const parentDir = path.dirname(winUnpackedDir);
|
|
|
|
exePath = path.join(parentDir, fileName, exeName);
|
|
|
|
exePath = path.join(parentDir, fileName, exeName);
|
|
|
|
exeFolder = path.join(parentDir, fileName);
|
|
|
|
exeFolder = path.join(parentDir, fileName);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
console.log("exePath", exePath);
|
|
|
|
console.log("exePath", exePath);
|
|
|
|
console.log("exeFolder", exeFolder);
|
|
|
|
console.log("exeFolder", exeFolder);
|
|
|
|
// 标准化路径格式
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
|
|
|
return { exePath, exeFolder };
|
|
|
|
return { exePath, exeFolder };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 启动LiveTalking.exe
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LiveTalking.exe
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
async function startProcess(fileName, exeName) {
|
|
|
|
async function startProcess(fileName, exeName) {
|
|
|
|
return new Promise(async (resolve, reject) => {
|
|
|
|
return new Promise(async (resolve, reject) => {
|
|
|
@ -232,38 +264,48 @@ async function startProcess(fileName, exeName) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取程序路径
|
|
|
|
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
|
|
|
|
const obj = getProcessExePath(fileName, exeName);
|
|
|
|
const obj = getProcessExePath(fileName, exeName);
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 启动进程时,通过wmic获取详细信息(仅Windows)
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>wmic<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ϸ<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Windows<EFBFBD><EFBFBD>
|
|
|
|
const newProcess = spawn("cmd.exe", ["/c", obj.exePath], {
|
|
|
|
// const newProcess = spawn("cmd.exe", ["/c", obj.exePath], {
|
|
|
|
// 直接运行bat,不使用start命令
|
|
|
|
// // ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bat<61><74><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>start<72><74><EFBFBD><EFBFBD>
|
|
|
|
cwd: obj.exeFolder,
|
|
|
|
// cwd: obj.exeFolder,
|
|
|
|
windowsVerbatimArguments: true,
|
|
|
|
// windowsVerbatimArguments: true,
|
|
|
|
windowsHide: false,
|
|
|
|
// windowsHide: false,
|
|
|
|
detached: false // 不分离,便于跟踪子进程
|
|
|
|
// detached: false // <20><><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
|
|
|
|
});
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
// 记录进程ID(关键:保存实际PID)
|
|
|
|
const newProcess = spawn(
|
|
|
|
|
|
|
|
"cmd.exe",
|
|
|
|
|
|
|
|
["/c", "start", '""', `"${obj.exePath}"`],
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
cwd: obj.exeFolder,
|
|
|
|
|
|
|
|
windowsVerbatimArguments: true,
|
|
|
|
|
|
|
|
windowsHide: false,
|
|
|
|
|
|
|
|
detached: true
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
// <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ID<49><44><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>PID<49><44>
|
|
|
|
processes[processKey] = {
|
|
|
|
processes[processKey] = {
|
|
|
|
process: newProcess,
|
|
|
|
process: newProcess,
|
|
|
|
pid: newProcess.pid // 保存PID用于后续终止
|
|
|
|
pid: newProcess.pid // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>PID<EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ
|
|
|
|
};
|
|
|
|
};
|
|
|
|
newProcess.on("error", err => {
|
|
|
|
newProcess.on("error", err => {
|
|
|
|
processes[processKey] = null;
|
|
|
|
processes[processKey] = null;
|
|
|
|
reject(`启动失败: ${err.message}`);
|
|
|
|
reject(`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>: ${err.message}`);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
console.log(`spawned with PID ${newProcess.pid}`);
|
|
|
|
console.log(`spawned with PID ${newProcess.pid}`);
|
|
|
|
resolve(`${fileName} 启动成功 (PID: ${newProcess.pid})`);
|
|
|
|
resolve(`${fileName} <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> (PID: ${newProcess.pid})`);
|
|
|
|
} catch (err) {
|
|
|
|
} catch (err) {
|
|
|
|
reject(`启动异常: ${err.message}`);
|
|
|
|
reject(`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣: ${err.message}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 停止所有进程
|
|
|
|
// ֹͣ<EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
async function stopAllProcesses() {
|
|
|
|
async function stopAllProcesses() {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 清空所有属性,变成空对象
|
|
|
|
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD>ɿն<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
for (const key in processes) {
|
|
|
|
for (const key in processes) {
|
|
|
|
if (processes[key]) {
|
|
|
|
if (processes[key]) {
|
|
|
|
delete processes[key];
|
|
|
|
delete processes[key];
|
|
|
@ -289,5 +331,6 @@ module.exports = {
|
|
|
|
bulkInsertSystemMessages,
|
|
|
|
bulkInsertSystemMessages,
|
|
|
|
clearSystemMessages,
|
|
|
|
clearSystemMessages,
|
|
|
|
startProcess,
|
|
|
|
startProcess,
|
|
|
|
stopAllProcesses
|
|
|
|
stopAllProcesses,
|
|
|
|
|
|
|
|
getAllSystemMessages
|
|
|
|
};
|
|
|
|
};
|
|
|
|