Runtime.getRuntime().exec("./重启.bat"); 为什么只运行到关闭这个服务,不执行重启服务?
功能是 定时检测,当发现版本和服务器版本不一致的时候,去下载最新的版本,并重启服务(jar包都注册成服务了。在windows环境)
不知道为什么 执行完net stop,就不执行下面这行了....
我看java日志是stop了,但是看计算机管理-服务-具体的这个服务还是正在运行状态的,可能这块有问题,没有关闭;但是我双击这个重启.bat,服务是会重启的,好奇怪
回答:
把关闭服务和启动服务的操作放两个文件里,然后中间加一个延迟试试:
Runtime.getRuntime().exec("./stopService.bat");Thread.sleep(5000);
Runtime.getRuntime().exec("./startService.bat");
回答:
我先确认一下,你这个脚本停止的,是你这个 Java 程序本身吗?
如果是的话当然有问题了……
net stop
不是强杀进程的,它是给服务发送一个停止信号,来让服务自己平稳地退出自己。但你这里 Java 程序此时在 exec()
这句阻塞着呢,它当然不会退出了。
你这里的流程就变成了:
- Java 程序启动了脚本
- 脚本执行 net stop,给 Java 程序发送了一个停止信号
- Java 程序:收到!但我主线程阻塞着呢,等脚本执行完我再退出
- 脚本:我等你退出呢
- Java:我等你执行完呢
- 脚本:我等你退出呢
- Java:我等你执行完呢
- 脚本:等不了了,我超时了 ┑( ̄Д  ̄)┍
- Java:啊?不用我退出了?那好吧 (^_^)
所以你没发现绝大部分软件,主程序和 updater 这种东西是两个完全独立的程序么……
如果你真的就想用一个程序来控制,那就别用 Runtime
这种会阻塞主线程的方式了,换成 ProcessBuilder
吧。
P.S. 注意用 ProcessBuilder 就别再调用 wait 了,否则那又变成阻塞了。
以上是 Runtime.getRuntime().exec("./重启.bat"); 为什么只运行到关闭这个服务,不执行重启服务? 的全部内容, 来源链接: utcz.com/p/945150.html