我有一个简单的Java客户端-服务器应用程序(在前面的Stack问题中链接的代码),我可以与以下Powershell代码一起运行:
Start-Process java "-cp .;.libcommons-io-2.4.jar FixedMessageSequenceServer"
Start-Sleep -Seconds 1
$JavaClient = Start-Process java "-cp .;.libcommons-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 .;.libcommons-io-2.4.jar FixedMessageSequenceServer" -Wait
Start-Process java "-cp .;.libcommons-io-2.4.jar FixedMessageSequenceClient -Wait -PassThru"
}
但是,当我运行它时,这不会做任何事情。我需要附加一些 Java ProcessBuilder
代码来实现所需的功能吗? 我们需要处理$JavaClient.ExitCode
吗?
谢谢
如果您只在单个 if 语句上求值,则即使您的代码确实有效,您也有一个小窗口可以重新启动。
我建议您创建一个小型轮询脚本,该脚本将每 10 秒、1 分钟等检查一次某个进程的状态,如果它没有运行,它可以以这种方式启动它。如果 java 客户端应该始终运行,则可以将其嵌套在无限循环中,或者如果脚本应该以一致的间隔/触发器运行(即每小时运行一次,等等),您可以使用计划任务来启动脚本。
尝试这样的事情:
if(![bool](get-process java -ErrorAction SilentlyContinue)){
start-process java "-cp .;.libcommons-io-2.4.jar FixedMessageSequenceClient -Wait -PassThru"
}
我有以下代码可以工作,但它不是很优雅的方式:
这是我的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 .;.libcommons-io-2.4.jar FixedMessageSequenceServer"
Start-Sleep -Seconds 1
Start-Process java "-cp .;.libcommons-io-2.4.jar FixedMessageSequenceClient"
当我运行Java代码时,我需要从Windows任务管理器中杀死Powershell.exe以触发上述waitFor()