Страница 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;
  }