Proces wykonywania Java na Linuksie
Od jakiegoś czasu zmagam się z tym problemem i nie mogę go naprawić. Próbowałem już różnych podejść (Runtime.exec (), ProcessBuiler), ale żaden z nich nie działa.
To jest mój problem. Mam laptopa, który jest zawsze włączony. Ten laptop uruchamia narzędzie java podłączone do arduino przez usb, aby włączyć i wyłączyć światła w domu. Sam stworzyłem ten program, dlatego też wykonuję na nim regularne prace konserwacyjne. Ostatnio dodałem przycisk, aby zrestartować program z mojego interfejsu html (w przypadku, gdy mam aktualizację lub z jakiegoś innego powodu może być konieczne ponowne uruchomienie programu lub zdecyduję się wdrożyć automatyczną aktualizację w najbliższej przyszłości).
Ta idea polega na uruchomieniu drugiej instancji aplikacji z pierwszej instancji, a następnie System.exit (0) pierwszej instancji.
Z jakiegoś powodu nie mogę uruchomić drugiej instancji aplikacji. Oto kod.
public void shutdown(boolean restart) {
if (this.serial != null) {
this.serial.disconnect();
}
if (restart) {
System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
String startupCommand = "java -jar \"" + this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("%20", " ") + "\"";
ProcessBuilder builder = new ProcessBuilder();
// String[] command = new String[1];
// command[0] = "-jar \"" + (System.getProperty("user.dir") + "/Home_Automation_Executor.jar") + "\"";
try {
// //System.out.println("Restarting Home Automation with command: " + command[0]);
// System.out.println("Restarting Home Automation with command: " + startupCommand);
// Runtime.getRuntime().exec("bash");
// Process proc = Runtime.getRuntime().exec(startupCommand);
Process proc = builder.command(startupCommand).start();
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("</ERROR>");
int exitVal = 0;
try {
exitVal = proc.waitFor();
} catch (InterruptedException ex) {
Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Process exitValue: " + exitVal);
} catch (IOException ex) {
ex.printStackTrace();
}
}
System.out.println("Terminating Home Automation");
System.exit(0);
}
java.io.IOException: Nie można uruchomić programu „java -jar” / Users / NightWalker / Dropbox / Development / Kod źródłowy / Java / NightWare Tools / Automatyka domowa / Automatyka domowa Executor / dist / Home_Automation_Executor.jar „”: błąd = 2, Brak takiego pliku lub katalogu w java.lang.ProcessBuilder.start (ProcessBuilder.java:460) w home.automation.executor.Engine.shutdown (Engine.java:186) w home.automation.executor.webserver.HTTPGenerator._handleActionCommand ( HTTPGenerator.java:190) w home.automation.executor.webserver.HTTPGenerator._generateHTTPPage (HTTPGenerator.java:165) w home.automation.executor.webserver.HTTPGenerator.getHTTPPage (HTTPGenerator.java:58) w home.automation.executor .webserver.HTTPRequestHandler.run (HTTPRequestHandler.java:160) Przyczyna: java.io.IOException: error = 2, brak takiego pliku lub katalogu w java.lang.UNIXProcess.forkAndExec (metoda natywna) w java.lang.UNIXProcess. (UNIXProcess.java:53) w java.lang.ProcessImpl.start (ProcessImpl.java:91) w java.lang.ProcessBuilder.start (ProcessBuilder.java:453 ) ... 5 więcej