LINUX.ORG.RU

Особенности реализации программы, для работы в качестве сервиса systemd

 


1

1

Всем привет, такой вопрос, есть ли какой-то перечень того, что должно быть реализовано в программе, чтобы она правильно работала как сервис systemd? Может быть какой-то how to есть? Я реализовал в программе перехват SIGINT и SIGTERM - достаточно ли этого?

есть ли какой-то перечень того, что должно быть реализовано в программе, чтобы она правильно работала как сервис systemd

Да. Держи: daemon(7).

Если вкратце, то делать не нужно почти ничего.

  • обрабатывай SIGTERM (ну ты в любом случае должен это делать),
  • возвращай 0 при успешном завершении процесса и 1 при завершении с ошибкой (то же самое),
  • рекомендуется заюзать sd_notify() и сделать Type=notify.

Демонизироваться не надо, логи можно писать прямо в stderr.

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

Демонизироваться не надо, логи можно писать прямо в stderr.

Логи в stdout (стандартный вывод - сообщения о ходе работы демона), ошибки в sderr (что-то пошло не так с самим демоном - например конфиг некорректен и прочее).

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

угу только потом логи из стдаут попадают в общий лог и такой срач разводят… одному поциенту пришлось вырезать опухоль.
StandardOutput=file:/var/log/resilio.log
StandardError=file:/var/log/resilio.err

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

ок. мне нужно чтобы «journalctl -b 0» был без логов одного конкретного юнита.
а логи конкретного юнита были доступны по systemctl status %service_name%.
т.е опция в .service для исключения выхлопа данного сервиса в общий лог.
есть такое ??

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

Логи в stdout (стандартный вывод - сообщения о ходе работы демона),

А потом при ручном запуске гадать к какому месту лога относится та или иная ошибка, поэтому имхо лучше делать немного не по стандарту:

лог и основные ошибки писать в stdout, полный поток ошибок(основные и мусорные) писать в stderr

torvn77 ★★★★★ ()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от pfg

Journalctl не умеет делать так:

чтобы «journalctl -b 0» был без логов одного конкретного юнита.

Но у тебе есть несколько опций:

  • Если тебе нужно смотреть системный лог (ведро и системные демоны), то для этого служит флаг –system, тогда journalctl выдаст тебе только логи ядра и важных сервисов.

  • Не всегда нужно смотреть общий лог ради одного демона. Используй флаг -u , чтобы просмотреть лог определенного юнита (аналог systemctl status, ,но лучше)

  • Если тебе прям нужно перенаправить вывод сервиса в файл, то вместо редактирования самого юнита создай drop-in, как говорил товарищ intelfx. Для этого в /etc/systemd/system/ создай каталог servicename.d и создай там .conf файл и переопределяй там нужные опции.

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

[quote] А потом при ручном запуске гадать к какому месту лога относится та или иная ошибка, поэтому имхо лучше делать немного не по стандарту:

лог и основные ошибки писать в stdout, полный поток ошибок(основные и мусорные) писать в stderr [/quote]

По-моему, это не круто. Ошибки должны быть в STDERR. При ручном запуске (который, по определению, не штатный режим для демона, а отладочный) можно сделать [inline]&>[/inline], если так уж хочется в одну кучу все.

Хм. А почему не получается сделать обычное ЛОРовское форматирование, как всегда получалось?

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

При ручном запуске

Не обязательно при ручном, при просмотре двух логов ведь будут теже проблемы.

С другой стороны если не хочется смотреть ошибки то строки с ними можно отфильтровать регекспом.

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

спасибо, уже ели :)

  • не подойдет. на целевой системе нет пользовательских сеансов системд.
  • мне надо наоборот - чтобы в общем логе не было выхлопа парочки сервисов.
  • я уже перенаправил и сделал это через дроп-ин /etc/systemd/system/resilio-sync.service.d/override.conf эти мелочи я знаю давно.

меня заинтересовало есть ли опции в системд не выкладывать выхлоп определенного сервиса в общий лог.

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

я уже перенаправил и сделал это через дроп-ин

Ну так надо было с этого и начинать, из твоего сообщения всем казалось, что ты наколхозил это в самом юните.

мне надо наоборот - чтобы в общем логе не было выхлопа парочки сервисов.

Ну, я уже говорил, что journalctl так не умеет, НО. Ты вполне можешь прибегнуть к помощи всеми любимого хрюникс вея и просто натравить grep на выхлоп journalctl)

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

НЕ РАБОТАЕТ !!! Как сделать, чтобы программа работала?

#include <stdio.h>
#include <wiringPi.h>
#define P_BTN_PWR    24
#define P_BTN_RUN    25
#define WAIT_NPRES   100
#define WAIT_PRES    3000
#define MAX_CMD_LINE 128

int main(int argc, char* argv[])
{
int run = 0;
char script[MAX_CMD_LINE];

wiringPiSetup();
pinMode(P_BTN_PWR, INPUT);

while(1)
if(digitalRead(P_BTN_PWR) == LOW)
system("shutdown -h now");

delay(WAIT_NPRES);
    return 0;
}

ZugDuk ()
Последнее исправление: ZugDuk (всего исправлений: 1)