首页 > 解决方案 > 如何在 app.on(“退出前”)中使用 shutdown.bat 停止 Tomcat?

问题描述

我尝试使用 Electron 在 Windows 上启动和停止 Tomcat 实例。

我已经修改了electron-quick-start项目以使用批处理文件停止我的 Tomcat 实例,该批处理文件shutdown.bat在所有 Electron 窗口关闭时或在我的应用程序退出之前调用 Tomcat。

shutdownTomcat.on ("data", ...)但是,当我关闭我的应用程序时,和shutdownTomcat.on ("exit", ...)监听器没有输出。唯一的输出console.log ("Hello world")来自我的app.on ("before-quit", ...).

我选择这种方法是因为我是 Electron 的新手,并且想测试 NodeJSspawn的行为。

当我在侦听器之外使用我的代码时app.on (),会显示输出,但我的 Tomcat 实例并未停止。但是,我startTomcat.bat调用 Tomcat 的文件可以startup.bat正常工作。

我已经阅读了 NodeJS 的childProcess文档(“在 Windows 上生成 .bat 和 .cmd 文件”),但我无法让它工作;这导致了我的问题,即问题出在哪里以及我做错了什么。

Main.js用于主要过程的文件:

const { app, BrowserWindow } = require('electron');
const { spawn } = require('child_process');
const path = require('path');

const start = path.resolve("./start.bat");
const startTomcat = spawn('cmd.exe', ['/c', start], {
   cwd: process.cwd(),
   detached: true,
});

// ...

app.on('before-quit',()=> {
  const shutdownTomcat = spawn('cmd.exe', ['/c', stop], {
    detached: true
    //  stdio: 'ignore' 
  });

  shutdownTomcat.stdout.on('data', (data) => {
    console.log("This data won't show up...", data);

  });

  shutdownTomcat.stderr.on('data', (data) => {
    console.log(data.toString());
  });

  shutdownTomcat.on('exit', (code) => {
    console.log(`Child Shutdown Tomcat exited with code ${code}`);
  });

  console.log("Hello World");
});

stop.bat最后,我用来调用 Tomcat 的批处理文件 ( ) shutdown.bat

cd /D "%~dp0"
cd "..\\apache-tomcat\\bin"
call shutdown.bat

标签: javascripthtmlnode.jselectron

解决方案


很可能您的电子应用程序在您的事件触发时已经终止。因此不再引用您生成的进程和侦听器。

您可以尝试event.preventDefault()取消应用退出。然后,您可以app.quit()在完成后显式地执行(但请注意在退出前的侦听器中无限循环;您可以将其删除或app.exit(0))。


推荐阅读