作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试创建一个简化的故障安全 Java 应用程序,每当强制关闭时(在 Windows 中,使用 CTRL+C 的 CMD 命令),该应用程序都会自行重新启动。
批处理代码如下所示:
@echo off
setlocal
start /wait java BatchWakeMeUpSomehow
if errorlevel 1 goto retry
echo Finished successfully
exit
:retry
echo retrying...
start /wait java BatchWakeMeUpSomehow
Java 代码是这样的:
public class WakeMeUpSomehow {
static class Message extends Thread {
public void run() {
try {
while(true)
{
System.out.println("Hello World from run");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
Runtime.getRuntime().addShutdownHook(new Message());
while(true)
{
System.out.println("Hello World");
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
我想澄清我的理解。我认为,由于Java运行在JVM环境中,因此它在重新启动强制关闭的JVM方面有一些限制(如果我们通过批处理文件重新启动强制关闭的JVM,那么它会失去光标焦点,并且它会丢失)。仅在无法获得键盘焦点的新 CMD 窗口中运行。
我的目标是让这个应用程序继续循环运行(类似于“数字怪胎”),但我只能重新运行它一次(它在无响应的 CMD 窗口中运行)
有人建议我查看 Apache Daemon 工具,但我不确定这有什么帮助。
最佳答案
要在错误级别 1 及以上的情况下进行无限循环,请在 start
行之前添加一个标签:
:run
start /wait java BatchWakeMeUpSomehow
if errorlevel 1 echo retrying... & goto run
echo Finished successfully
但是这也会打开一个新窗口,因此如果您想在已启动的窗口中重新启动 java
进程,您可以使用 typeperf
来检查其 CPU 使用情况(这样您就可以强制关闭进程并重新启动它)或者只需在执行返回到批处理文件中后重新启动 java
即可。
如果 java
进程退出(未挂起),我们可以使用 tasklist
检测它:
:run
start java BatchWakeMeUpSomehow
:check
timeout 1 >nul
tasklist /fi "imagename eq java.exe" | find "java.exe" >nul
if errorlevel 1 echo retrying... & goto run
goto check
如果 java
进程挂起并且 CPU 使用率为 0% 持续 1 分钟:
if not "%~1"=="childprocess" goto main
:loop
java BatchWakeMeUpSomehow
goto loop
:main
start "" "%~dpnx0" childprocess
:check
for /f "skip=2 delims=, tokens=2" %%a in ('
typeperf "\process(java)\%% processor time" -sc 1 -si 60
') do if %%a=="0.000000" taskkill /f /im java.exe
goto check
关于java - 为什么我重新启动的 Java 程序会失去键盘焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33308385/
我是一名优秀的程序员,十分优秀!