LINUX.ORG.RU
решено ФорумAdmin

systemd, демон, задержка при старте по чтению логов

 , ,


0

2

Есть такой сервис:

[Unit]
Description=Bla Tomcat Service

[Service]
Type=forking
User=bla
PIDFile=/home/bla/tomcat/tomcat.pid
ExecStart=/home/bla/tomcat/bin/startup.sh
ExecStop=/home/bla/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

при старте в файле /home/bla/tomcat/logs/catalina.out начинают идти логи и в определённый момент проходит строчка

21-Feb-2015 22:15:20.970 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 11232 ms

хочется, чтобы при команде systemctl bla start команда не отдавала управление, пока в логе не появится эта строчка (именно после старта, файл до старта в общем случае не пустой). Можно ли такое сделать не сильно усложняя сервис? Или это противоречит концепции systemd?

Перемещено leave из admin

Перемещено leave из general

★★★★★

Как вариант можно создать bla-ready, который будет active после появления этой строчки. Можно, конечно, sysvinit-style запилить обёртку-шеллскрипт, но это и нагрузка и костыль.

r3lgar ★★★★★ ()

Можно в ExecStartPost грепнуть эту строку в логе один раз и выйти. Но раз лог не пустой, нужно что то придумать чтобы грепалась строка именно из этого запуска (например начинать читать файл с определённой позиции, в которой кончился предыдущий запуск)

disarmer ★★★ ()

Да, можно. Причём юнит вообще трогать не нужно, править придётся исключительно скрипт: http://ix.io/gvr

Одна проблема: если твой демон упадёт, скрипт будет ждать вечно (до таймаута systemd'шного, если точнее). Чтобы её обойти, придётся пилить второй сервис, как предложил бывший funeralismatic.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 2 )
Ответ на: комментарий от r3lgar

Костыль всё равно придётся делать, причём в любом случае шелловый. А скрипт запуска там уже используется.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Костыль всё равно придётся делать

Да, но зависит от навыка костылестроителя.

причём в любом случае шелловый

Не обязательно. Можно на любом скриптовом языке запилить, например на питоне — всяко красивее выйдет.

r3lgar ★★★★★ ()
Ответ на: комментарий от r3lgar

Да, конечно, имелось в виду «скриптовый».

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

А через ExecStartPost чем плохо? Скрипт править не хочу, он в поставке tomcat-а идёт, при обновлении придётся лишнюю работу делать.

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

На самом деле ничем. Я (ошибочно) думал, что сервис объявляется запущенным сразу после ExecStart=. А на самом деле нет.

Тогда через ExecStartPost= вот таким скриптом:

#!/bin/bash
grep -q Started < <(tail -n0 -f log)

intelfx ★★★★★ ()

сорри за двойной перенос туда-обратно, кнопкой ошибся (

leave ★★★★★ ()

Итоговое решение:

ExecStartPost=/bin/bash -c 'grep -q "Server startup" < <(tail -n0 -f "/home/bla/tomcat/logs/catalina.out" --pid=$$$$)'

--pid нужен, чтобы tail не висел после завершения скрипта, $$$$ потому что systemd сам делает variable expansion, и $$ превращается в $.

Legioner ★★★★★ ()
Ответ на: комментарий от intelfx

Пока в логе не появится новая запись, будет висеть. Как появится — умрёт при попытке записи в stdout. Только она там долго может не появляться :)

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1 )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.