Почему код java X прерывается, когда другой код, который начал код X, подходит к концу?

#java

Вопрос:

У меня в файле crontab есть следующая строка : */ 8-21 * * * /usr/bin/xfce4-terminal --display=:0 -H --command="java -jar /full/path/to/myJarFile.jar" это запускает файл jar каждые 10 минут между 8 и 22 часами и отлично работает.

В коде java (в myJarFile.jar) есть следующие строки :

 String command = "/usr/bin/xfce4-terminal --display=:0 -H --command='java -jar /full/path/to/"   which   ".jar'";
String[] commandNArgs = new String[]{"/bin/sh", "-c", command};
Process p;
try {
   p = Runtime.getRuntime().exec(commandNArgs);
} catch (Exception e) {
   System.out.println("please restart");
}
 

Эти строки запускают несколько файлов jar, в зависимости от значения строки «which». Пока все хорошо.
Но затем java-код в myJarFile.jar подходит к концу, который закрывает только что запущенные «какие коды», хотя они должны все еще работать …
(Если я введу команду /usr/bin/xfce4-terminal --display=:0 --command="java -jar /full/path/to/myJarFile.jar" вручную в терминал, все окна останутся открытыми, как и ожидалось.)
Надеюсь, кто-нибудь знает, почему они закрываются ?

Комментарии:

1. возможно, это не связано с проблемой, но почему вы запускаете свои команды с помощью /usr/bin/xfce4-terminal ?

2. Похоже, что вашим банкам нужен графический интерфейс и открытые окна (вместо безголовых). Вот почему ты отказываешься от этого --display=:0 варианта, верно?

3. @MarcoLucidi amp; hc_dev : единственная причина как для xfce4-терминала, так и для отображения=:0 заключается в том, чтобы иметь возможность немедленно видеть вывод строк System.out.println() в коде (чтобы быть уверенным, что все работает так, как должно). Никакой графический интерфейс вообще не нужен.

4. @Veronique Я настоятельно рекомендую вам использовать файл журнала для хранения (и просмотра) выходных данных, а также для избавления от обоих /usr/bin/xfce4-terminal и /bin/sh .

5. @Вероника хорошо, значит, у вас уже есть кое-какие настройки ведения журнала, хорошо! вы можете преобразовать свой System.out.println() s в » log.println() » и запускать свои банки напрямую (как из crontab и myJarFile.jar ), например: Runtime.getRuntime().exec(new String[] { "java", "-jar", "/full/path/to/" which ".jar" }); чем вы можете просматривать «текущие обновления» в файле журнала, например, с помощью tail -f /path/to/log .