Преглед на файлове

关闭node ,杀死策略!!!

hl преди 11 месеца
родител
ревизия
860ee39438
променени са 2 файла, в които са добавени 92 реда и са изтрити 2 реда
  1. 38 1
      client.js
  2. 54 1
      src/robot.js

+ 38 - 1
client.js

@@ -2,9 +2,46 @@ const web = require('./src/web')
 const config = require('./src/config')
 const interval = require('./src/Interval')
 
+const robot  = require('./src/robot')
+const {getRustConfig} = require("./src/config");
+const {logger} = require("./src/utils/logger");
+const {exec} = require("child_process");
+
 
 config.init()
 // 启动web
 web.init()
 // 定时任务
-interval.init()
+interval.init()
+
+
+//node关机前的一些操作
+// 当进程即将退出时执行一些操作
+process.on('exit', (code) => {
+    console.log(`即将退出,退出码:${code}`);
+    // 在这里执行清理工作
+});
+
+// 监听SIGINT信号(例如用户按下Ctrl+C)
+process.on('SIGINT', () => {
+    console.log('收到SIGINT信号,准备退出...');
+    // 在这里执行清理工作
+    process.exit(); // 这将触发exit事件
+});
+
+// 监听SIGTERM信号(通常是系统请求进程终止)
+process.on('SIGTERM', async () => {
+    console.log('收到SIGTERM信号,准备退出...');
+    // 关机前为了防止 node 更新,需要吧map 里面的pid 写在本地文件
+    await robot.closeAppAll()
+
+    // 在这里执行清理工作
+    process.exit(); // 这将触发exit事件
+});
+
+// 还可以处理未捕获的异常
+process.on('uncaughtException', (err) => {
+    console.error('捕获到未处理的异常:', err);
+    // 在这里执行清理工作
+    process.exit(1); // 非零退出码表示异常退出
+});

+ 54 - 1
src/robot.js

@@ -27,6 +27,10 @@ const RobotStatus = Object.freeze({
 
 let appMap = new Map();
 
+function getAppMap() {
+    return appMap;
+}
+
 
 function getApp(key) {
     let app = {
@@ -430,6 +434,55 @@ async function restartApp(param) {
     logger.info(`重启完成!!!!!`);
 }
 
+async function closeAppAll() {
+    return new Promise(async (resolve, reject) => {
+
+        var appMap = getAppMap()
+        // console.log(appMap.size); // 输出Map的大小
+        appMap.forEach((value, key) => {
+            console.log(key, value); // 输出Map的键值对
+            // logger.info("???", key, value)
+            var app = value
+            logger.info(` 信号:  `, app.threadStatus);
+            /*******新的删除方式*************/
+            //文件授权
+            if (app.childProcess !== undefined) {
+                var pid = app.childProcess.pid
+                exec(`sudo kill ${pid}`, (error, stdout, stderr) => {
+                    if (error) {
+                        logger.error(`进程${pid} 杀死失败: ${error}`);
+                    }
+                    logger.info(`进程${pid} 杀死成功`);
+                    logger.info(`当前app:`, app);
+                    app.threadStatus = RobotStatus.STOP_PENDING
+                    robotStatus(app)
+                });
+            }
+        });
+
+        while (true) {
+            var z = 0;
+            await delay(1000)
+            var str = "";
+            appMap.forEach((value, key) => {
+                str += "机器人:"+key+",当前状态:"+value.threadStatus+"\t"
+                if(value.threadStatus !== RobotStatus.STOPPED){
+                    z+=1
+                }
+            });
+            logger.info(str)
+            if(z===0){
+                logger.info(`策略全部关闭~~开始关闭node`);
+                break
+            }else{
+                logger.info(`等待关闭~~策略!`);
+            }
+        }
+
+        return resolve(true)
+    })
+    /*******新的删除方式*************/
+}
 
 // 下载执行程序,使用的实行服务器指令的方式进行下载
 function downloadFileWithPowerShell(url, destination, headers, funBreak) {
@@ -521,5 +574,5 @@ function delRobot(app) {
 
 
 module.exports = {
-    run, closeApp, restartApp, delRobot, robotStatus, robotAmount, appMap, RobotStatus
+    run, closeApp, restartApp, delRobot, robotStatus, robotAmount, closeAppAll, appMap, getAppMap, RobotStatus
 };