Подтвердить что ты не робот

Apache jsvc не может остановить демон

Я использую собственный скомпилированный jsvc для запуска java-демона. Я запускаю это на openSUSE 32 бит vm. Код реализует интерфейс daemon Apache, и я выполняю деамон со следующей командой.

./jsvc -home jre -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon

Он запускается и запускается без проблем. Я могу запустить демона как обычный пользователь и как root. Однако, когда я иду на завершение демона, jsvc убивает процесс, а не выдаёт команду остановки.

./jsvc -stop -home jre -outfile logs/jsvc.err -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon

Процесс daemon умирает, но не выполняет никаких шагов его выключения (например, он должен регистрироваться, отмечать запись в db и т.д.). Я получаю следующее в файле logs/jsvc.err и не записывает никаких других журналов:

Service exit with return value 143

После ошибки в googling я вижу несколько людей, которые все видели одно и то же, но нигде не могу найти хорошее разрешение (http://mail-archives.apache.org/mod_mbox/commons-dev/200401.mbox/%3CPine.GSO.3.96.1[email protected]%3E, http://www.tek-tips.com/viewthread.cfm?qid=1014679, http://threebit.net/mail-archive/tomcat-users/msg03832.html).

UPDATE: Использование Apache window service launcher (procrun) Я могу запустить и остановить службу без каких-либо проблем. Проблема, по-видимому, связана только с jsvc и только при остановке демона.

ОБНОВЛЕНИЕ 2: Прочитав http://commons.apache.org/daemon/jsvc.html#Starting_jsvc более подробно, я заметил, что тег остановки, который я использую, вызывает команду kill pn процесса через файл pid, который я указываю. Похоже, что jsvc фактически не останавливает демона изящно по дизайну. Это согласуется с поведением, которое я вижу, поскольку очень сложный метод остановки не пишет никаких сообщений.

-stop        stop the service using the file given in the -pidfile option

Новые вопросы:

  • Если в моем java-сервере был реализован интерфейс Apache Daemon, как я могу сделать "остановку" на запущенном демоне?
  • Нужно ли мне что-то другое, кроме jsvc (что кажется ему полезным только для запуска или убийства демона)?
4b9b3361

Ответ 1

А, хорошо. Оказывается, команда остановки jsvc вела себя правильно. Мне пришлось копаться в том, что процессы получают сообщения о завершении в Linux/Unix с помощью команды kill. Jsvc выдает на демона kill -15 (который является мягким убийством). Смотрите: http://commons.apache.org/daemon/ и http://en.wikipedia.org/wiki/Kill_(command) для описание того, как процессы unix получают сообщения.

Реальная проблема заключалась в создании демона. В моем методе запуска демона зациклировалась до тех пор, пока не была выписана команда shutdown, что помешало демонам отказаться от управления в качестве дочернего процесса демона.

У меня было это:

@Override
public void start() 
{
    doStartWork();
    while (isAlive()) 
    {
        Thread.sleep(1000); 
    }
}

Я должен был иметь ниже, так что я мог бы вернуться и позволить потоку демона получать сигналы от ОС. См. http://commons.apache.org/daemon/jsvc.html#How_jsvc_works, разделяя раздел под заголовком:" Контролируемый процесс:

@Override
public void start() 
{
    doStartWork();
}