Мое приложение Java устанавливается в ОС OpenSUSE 13.2, и я использую systemd для управления процессом. (systemd версия 210)
Я хотел бы воспользоваться функцией сторожевого таймера systemd с помощью systemd-notify. Однако я замечаю, что приложение перезапускается из-за несогласованных тайм-аутов сторожевого таймера.
При WatchdogSec = 120 и приложении, настроенном на вызов systemd-notify каждые 60 секунд, я наблюдаю перезапуски в среднем каждые 5-20 минут.
вот (слегка отредактированный) файл модуля systemd для процесса:
# Cool systemd service
[Unit]
Description=Something Awesome
After=awesomeparent.service
Requires=awesomeparent.service
[Service]
Type=simple
WorkingDirectory=/opt/awesome
Environment="AWESOME_HOME=/opt/awesome"
User=awesomeuser
Restart=always
WatchdogSec=120
NotifyAccess=all
ExecStart=/home/awesome/jre1.8.0_05/bin/java -jar awesome.jar
[Install]
WantedBy=multi-user.target
А вот код для вызова systemd-notify
String pidStr = ManagementFactory.getRuntimeMXBean().getName();
pidStr = pidStr.split("@")[0];
String cmd = "/usr/bin/systemd-notify";
Process process = new ProcessBuilder(cmd,
"MAINPID=" + pidStr,
"WATCHDOG=1").redirectErrorStream(true)
.start();
int exitCode = 0;
if ((exitCode = process.waitFor()) != 0) {
String output = IOUtils.toString(process.getInputStream());
Log.MAIN_LOG.error("Failed to notify systemd: " +
((output.isEmpty()) ? "" : " " + output) +
" Exit code: " + exitCode);
}
В журналах я никогда не вижу сообщений об ошибках (процесс всегда возвращает 0 код выхода), и я на 100% уверен, что задача выполняется один раз в минуту, в минуту. Я вижу, что журнал задач выполняется непосредственно перед перезапуском.
У кого-нибудь есть идеи, почему systemd-notify иногда просто не работает?
Я думаю о написании кода для прямого вызова sd_pid_notify, но хотел бы знать, есть ли простая вещь с конфигурацией, которую я могу сделать, прежде чем идти по этому маршруту.
ProcessBuilder.start()
и использовал оболочку оболочки журналирования надsystemd-notify
, чтобы убедиться, что вызов подпроцесса выполняется точно во время и нет никаких непредсказуемых задержек. - person user3159253   schedule 28.11.2015sd_notify()
напрямую раз в секунду. У меня нет никаких указаний на то, что процесс отправки уведомлений вообще был остановлен. - person Mark Lakata   schedule 28.04.2016