Просмотр stdout / stderr службы systemd

175

Я создал простой файл службы systemd для пользовательского приложения. Приложение работает хорошо, когда я запускаю его вручную, но мой процессор загружается с максимальной нагрузкой, когда я запускаю его с помощью systemd.

Я пытаюсь отследить, где моя проблема, но я не знаю, где найти вывод (или как настроить systemd, чтобы поместить вывод куда-то).

Вот мой сервисный файл:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

Во всем приложении я вывожу на stdout и stderr.

Как я могу прочитать вывод моего демона?

Редактировать:

Я нашел man systemd.exec, что упомянул StandardOutput=вариант, но я не уверен, как его использовать. Со страницы руководства :

StandardOutput=

Управляет подключением файлового дескриптора 1 (STDOUT) выполненных процессов. Принимает один из наследовать , нуль , телетайп , системный журнал , kmsg , kmsg + консоли , системный журнал + консоли или розеткой .

Если установлено наследование, дескриптор файла стандартного ввода дублируется для стандартного вывода. Если установлено значение null, стандартный вывод будет подключен к /dev/null, то есть все записанное на нем будет потеряно. Если установлено значение tty, стандартный выход будет подключен к tty (как настроено через TTYPath=, см. Ниже). Если TTY используется для вывода, только исполняемый процесс не станет процессом управления терминалом и не будет отказывать или ждать, пока другие процессы освободят терминал. Системный журнал подключает стандартный вывод к системному журналу системного журнала (3). kmsg связывает его с буфером журнала ядра, который доступен через dmesg (1). системный журнал + консоль и KMSG + консольработать аналогично, но скопировать вывод в системную консоль. сокет соединяет стандартный вывод с сокетом после активации сокета, семантика аналогична соответствующей опции StandardInput=. Этот параметр по умолчанию наследуется.

Значит ли это, что это мои единственные варианты? Я хотел бы, например, поместить вывод /dev/shmили что-то. Я полагаю, я мог бы использовать сокет домена Unix и написать простой слушатель, но это кажется немного ненужным.

Мне просто нужно это для отладки, и я, вероятно, в конечном итоге удаляю большинство журналов и изменяю вывод на syslog.

beatgammit
источник
Вы пробовали проверить /var/log/syslogвывод? Большинство систем будут входить в систему, /var/log/поэтому я начну с проверки там. Вы можете использовать grepдля поиска текста, если вы знаете вывод: grep "my output" /var/logследует сделать свое дело.
sbtkd85
@ sbtkd85 - Ну, у меня нет /var/log/syslog, но /var/log/messagesделает свое дело. Проблема заключается в том, что, согласно журналам, мой демон падает при запуске, но я могу сказать, что он все еще работает, потому что у него есть HTTP-сервер, и я могу запросить его. Кажется, что остальные журналы теряются ...
beatgammit
Почему бы не попробовать настройку, StandardOutput=ttyчтобы вы могли видеть, что происходит при запуске демона. Он должен выводить терминал (возможно, вам придется использовать ttyS0или аналогичный, чтобы получить вывод на ваш экран).
sbtkd85
3
В этом контексте не должны работать стандартные операторы перенаправления ввода-вывода. Нечто подобноеExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Дипак Миттал
Что на самом деле злоупотребляет вашим процессором? Это systemd, ваш сервис или система (например, путем создания новых копий сервиса, потому что systemd сошел с ума)?
Петер

Ответы:

184

Обновить

Как отмечает mikemaccana, журнал systemd теперь является стандартным устройством регистрации для большинства дистрибутивов. Для просмотра stdoutи stderrсистемного блока используйте journalctlкоманду.

sudo journalctl -u [unit]

Оригинальный ответ

По умолчанию stdoutи stderrсистемный модуль отправляются в системный журнал.

Если вы используете полный systemd, это будет доступно через journalctl. На Fedora так и должно быть, /var/log/messagesно syslog поместит его там, где говорят ваши правила.

В связи с датой поста, и предполагая , что большинство людей, которые подвергаются воздействию Systemd которые с помощью фетровой шляпой, вы, вероятно , пострадали от ошибки , описанной здесь: https://bugzilla.redhat.com/show_bug.cgi?id=754938 имеет хорошее объяснение того, как все это работает тоже =) (Это была ошибка в selinux-policy, из-за которой сообщения об ошибках не регистрировались и были исправлены selinux-policy-3.10.0-58.fc16)

Matt
источник
5
Обратите внимание, что использование стандартного механизма ведения журнала, подобного этому, не будет создавать постоянные журналы по умолчанию. Для этого вам нужно создать / var / log / journal, а затем запуститьsudo systemctl restart systemd-journald
mlissner
1
какие средства и приоритеты системного журнала?
Jrwren
2
Это сработало для меня: StandardOutput=syslog+consoleи StandardError=syslog+consoleпосле этого все выходные данные из моего блока появились в journalctl. Настройка по умолчанию была неправильной, по-видимому. (Например, DefaultStandardOutput в /etc/systemd/system.conf)
gregn3
2
-fбыло полезно для меня. Следил за журналом, когда происходили изменения (
сценарий
2
Это сводит меня с ума ... На стандартном растяжке Debian журнал не показывает никаких стандартных выводов. Я даже пользуюсь /usr/bin/stdbuf -oL <cmd>и явным StandardOutput=journal. Еще ничего.
18:18
81

Короче, проще, не унаследованный ответ:

sudo journalctl -u [unitfile]

Где [unitfile] - системное .serviceимя. Например, чтобы увидеть сообщения от myapp.service,

sudo journalctl --unit=myapp

Чтобы следить за журналами в режиме реального времени:

sudo journalctl -f -u myapp
mikemaccana
источник
4
Обратите внимание, что вам может потребоваться, sudoесли вы получите No journal files foundошибку.
bigjosh
5
Системный журнал не является наследием ...
Майлз Рут
2
Это в текущих дистрибутивах Linux. Возможно, вам действительно нравится syslog, но это не меняет того, с чем они поставляются.
mikemaccana
1
Конечно. И это также использует системный журнал. Моя точка зрения заключалась не в том, что systemd не используется, а в том, что системный журнал не является устаревшим.
Лабиринт
6
@JECompton, если для всех журналов в текущих дистрибутивах Linux используется journald, а syslog не нужен и используется только для совместимости, то логически следует, что syslog является устаревшим.
mikemaccana