Apache jsvc не может остановить демон
Я использую нативный скомпилированный jsvc для запуска Java-демона. Я использую это на 32-битной виртуальной машине openSUSE. Код реализует интерфейс демона 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
Процесс-демон умирает, но не выполняет ни одного из этапов его завершения (например, он должен войти в систему, отметить запись в БД и т. Д.). Я получаю следующее в файле logs/jsvc.err, и он не записывает другие журналы:
Service exit with return value 143
После поиска ошибки я вижу несколько людей, которые все видели одно и то же, но нигде не могу найти хорошего разрешения (http://mail-archives.apache.org/mod_mbox/commons-dev/200401. mbox/%3CPine.GSO.3.96.1040105133739.23375A-100000@merlot.tel.uva.es%3E, http://www.tek-tips.com/viewthread.cfm?qid=1014679, http://threebit.net/mail-archive/tomcat-users/msg03832.html).
ОБНОВЛЕНИЕ: Используя средство запуска службы окна Apache (procrun), я могу запускать и останавливать службу без каких-либо проблем. Проблема, по-видимому, связана только с jsvc и только при остановке демона.
ОБНОВЛЕНИЕ 2: Внимательно прочитав http://commons.apache.org/daemon/jsvc.html, я заметил, что используемый мной метка остановки выдает команду kill в процессе через указанный мной pid-файл. Кажется, что jsvc на самом деле не останавливает демона изящно. Это согласуется с поведением, которое я наблюдаю, поскольку сам метод многословной остановки не выписывает никаких сообщений.
-stop stop the service using the file given in the -pidfile option
Новые вопросы:
- Если в моей java main реализован интерфейс Apache Daemon, как мне выполнить "останов" на работающем демоне?
- Нужно ли мне что-то кроме jsvc (кажется, что это полезно только для запуска или убийства демона)?
1 ответ
Ах хорошо. Оказывается, команда jsvc stop работает правильно. Мне пришлось разобраться, как процессы получают сообщения завершения в Linux/Unix с помощью команды kill. Jsvc выдает kill -15 (мягкое уничтожение) демону. Смотрите: http://commons.apache.org/daemon/ и http://en.wikipedia.org/wiki/Kill_(command) для описания того, как процессы unix получают сообщения.
Настоящая проблема заключалась в создании демона. В моем методе запуска демон зацикливался до тех пор, пока не была подана команда выключения, которая помешала демону отказаться от управления как дочернего процесса демона.
У меня было это:
@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();
}