我有一个简单的Java客户端 - 服务器应用程序(code linked on previous Stack question here),我可以使用以下Powershell代码一起运行:
Start-Process java "-cp .;.\lib\commons-io-2.4.jar FixedMessageSequenceServer"
Start-Sleep -Seconds 1
$JavaClient = Start-Process java "-cp .;.\lib\commons-io-2.4.jar FixedMessageSequenceClient -Wait -PassThru"
这很好用。但是,我想添加Powershell代码或Java代码,如果我们强制关闭(通过CTRL-C
)应用程序(从服务器端),将重新启动上述Powershell代码。
我认为我应该是苹果才能使用这段代码:
if($JavaClient.ExitCode)
{
# exit code is non-zero, better retry
Start-Process java "-cp .;.\lib\commons-io-2.4.jar FixedMessageSequenceServer" -Wait
Start-Process java "-cp .;.\lib\commons-io-2.4.jar FixedMessageSequenceClient -Wait -PassThru"
}
然而,当我运行它时,这没有任何作用。我是否需要附加一些Java ProcessBuilder
代码才能实现所需的功能?我们需要处理$JavaClient.ExitCode
吗?
感谢
答案 0 :(得分:1)
如果你只是在一个if语句上进行评估,那么你有一个小窗口可以重新启动,即使你的代码确实有效。
我建议您创建一个小的轮询脚本,它将每10秒,1分钟等检查某个进程的状态,如果它没有运行,它可以以这种方式启动。如果java客户端应该一直运行,你可以将它嵌套在无限循环中,或者如果它应该以一致的间隔/触发器运行(即每小时的顶部等等),你可以使用计划任务启动脚本。 )
尝试这样的事情:
if(![bool](get-process java -ErrorAction SilentlyContinue)){
start-process java "-cp .;.\lib\commons-io-2.4.jar FixedMessageSequenceClient -Wait -PassThru"
}
答案 1 :(得分:0)
以下代码我的作品,但它不是很优雅的方式:
这是我的Java类:
import java.io.*;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FixedMessageRunner{
public static void main(String[] args) {
// File file = new File("C://Java_Scratch_//Autonomic_Using_Batch//someFile.txt" );
try {
/* StackOverflow code */
for ( ; ; ) {
ProcessBuilder pb = new ProcessBuilder("Powershell ", "WindowsTaskSchedulerPS.PS1");
pb.directory(new File("C://Java_Scratch3_new_cleaned_Mar12//"));
Process p = pb.start();
p.waitFor();
}
/* end - StackOverflow code */
}
catch (IOException i) {
i.printStackTrace();
}
catch (InterruptedException i) {
i.printStackTrace();
}
// end-count_func
}
}
这是我的powershell代码,标准代码:
# exit code is non-zero, better retry
Start-Process java "-cp .;.\lib\commons-io-2.4.jar FixedMessageSequenceServer"
Start-Sleep -Seconds 1
Start-Process java "-cp .;.\lib\commons-io-2.4.jar FixedMessageSequenceClient"
当我运行Java代码时,我需要从Windows任务管理器中删除Powershell.exe,以便触发上面的waitFor()