Java в Linux перезапуск сервиса

Модератор: Absurd

Ответить
_qwe_
Сообщения: 2
Зарегистрирован: 22 мар 2007, 22:52
Контактная информация:

у меня проблемка: хочу чтобы программа перезапустила сама себя, для чего выполняю например ..exec("usr/../restart.sh") но после того как выполнится остановка приложения работа .sh прекращается - у меня такое ощущение что просто все процессы сносяться (в Windows такой проблемы нет при аналогичных действиях)
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Обращаю внимание, что exec в Unix API не идентичен CreateProcess в win32.
Процесс, запущенный через exec вытеснаяет текущий процесс и начинает работать вместо него. Чтобы породить новый процесс, надо вызвать функцию fork(), а уже потом exec().
2B OR NOT(2B) = FF
_qwe_
Сообщения: 2
Зарегистрирован: 22 мар 2007, 22:52
Контактная информация:

Absurd писал(а):Обращаю внимание, что exec в Unix API не идентичен CreateProcess в win32.
Процесс, запущенный через exec вытеснаяет текущий процесс и начинает работать вместо него. Чтобы породить новый процесс, надо вызвать функцию fork(), а уже потом exec().
что за fork() - это ведь не из runtime и не process ???
подскажи плз я в Linux не очень а тут приложение надо писать

new Thread(runnable).start(); так ?
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

_qwe_ писал(а):что за fork() - это ведь не из runtime и не process ???
подскажи плз я в Linux не очень а тут приложение надо писать
А, ты имеешь в виду Java exec()? Извини, перепутал. У меня на работе есть запуск внешних скриптов на шелле из Джавы, завтра кину сюда отрывок.
2B OR NOT(2B) = FF
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Вроде работает и на Винде, и на Солярисе.

Код: Выделить всё

 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;
  }
2B OR NOT(2B) = FF
Ответить