Страница 1 из 1
Java в Linux перезапуск сервиса
Добавлено: 22 мар 2007, 23:02
_qwe_
у меня проблемка: хочу чтобы программа перезапустила сама себя, для чего выполняю например ..exec("usr/../restart.sh") но после того как выполнится остановка приложения работа .sh прекращается - у меня такое ощущение что просто все процессы сносяться (в Windows такой проблемы нет при аналогичных действиях)
Re: Java в Linux перезапуск сервиса
Добавлено: 22 мар 2007, 23:49
Absurd
Обращаю внимание, что exec в Unix API не идентичен CreateProcess в win32.
Процесс, запущенный через exec вытеснаяет текущий процесс и начинает работать вместо него. Чтобы породить новый процесс, надо вызвать функцию fork(), а уже потом exec().
Re: Java в Linux перезапуск сервиса
Добавлено: 23 мар 2007, 00:22
_qwe_
Absurd писал(а):Обращаю внимание, что exec в Unix API не идентичен CreateProcess в win32.
Процесс, запущенный через exec вытеснаяет текущий процесс и начинает работать вместо него. Чтобы породить новый процесс, надо вызвать функцию fork(), а уже потом exec().
что за fork() - это ведь не из runtime и не process ???
подскажи плз я в Linux не очень а тут приложение надо писать
new Thread(runnable).start(); так ?
Re: Java в Linux перезапуск сервиса
Добавлено: 23 мар 2007, 01:21
Absurd
_qwe_ писал(а):что за fork() - это ведь не из runtime и не process ???
подскажи плз я в Linux не очень а тут приложение надо писать
А, ты имеешь в виду Java exec()? Извини, перепутал. У меня на работе есть запуск внешних скриптов на шелле из Джавы, завтра кину сюда отрывок.
Re: Java в Linux перезапуск сервиса
Добавлено: 23 мар 2007, 12:09
Absurd
Вроде работает и на Винде, и на Солярисе.
Код: Выделить всё
private boolean isPollingAllowed() {
boolean retVal;
if (nodeStatusUtil != null) {
InputStream stdoutStream = null;
InputStream stderrStream = null;
try {
final Runtime rt = Runtime.getRuntime();
final Process checkingProcess = rt.exec(nodeStatusUtil);
stdoutStream = checkingProcess.getInputStream();
stderrStream = checkingProcess.getErrorStream();
while (stdoutStream.read() != -1) { }
while (stderrStream.read() != -1) { }
int result = checkingProcess.waitFor();
if (result == 0) {
Log.info("Node status check: MASTER");
retVal = true;
} else {
Log.info("Node status check: SLAVE");
retVal = false;
}
} catch (IOException e) {
Log.error("Can't get node status", e);
retVal = false;
} catch (InterruptedException e) {
Log.error("Can't get node status", e);
retVal = false;
} finally {
if (stdoutStream != null) { try { stdoutStream.close(); } catch (Exception e0) { } }
if (stderrStream != null) { try { stderrStream.close(); } catch (Exception e0) { } }
}
} else {
Log.info("Node status check: Not available. Acting as a master");
retVal = true;
}
return retVal;
}