Я создал простой файл службы 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.
источник
/var/log/syslog
вывод? Большинство систем будут входить в систему,/var/log/
поэтому я начну с проверки там. Вы можете использоватьgrep
для поиска текста, если вы знаете вывод:grep "my output" /var/log
следует сделать свое дело./var/log/syslog
, но/var/log/messages
делает свое дело. Проблема заключается в том, что, согласно журналам, мой демон падает при запуске, но я могу сказать, что он все еще работает, потому что у него есть HTTP-сервер, и я могу запросить его. Кажется, что остальные журналы теряются ...StandardOutput=tty
чтобы вы могли видеть, что происходит при запуске демона. Он должен выводить терминал (возможно, вам придется использоватьttyS0
или аналогичный, чтобы получить вывод на ваш экран).ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Ответы:
Обновить
Как отмечает mikemaccana, журнал systemd теперь является стандартным устройством регистрации для большинства дистрибутивов. Для просмотра
stdout
иstderr
системного блока используйтеjournalctl
команду.Оригинальный ответ
По умолчанию
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
)источник
sudo systemctl restart systemd-journald
StandardOutput=syslog+console
иStandardError=syslog+console
после этого все выходные данные из моего блока появились в journalctl. Настройка по умолчанию была неправильной, по-видимому. (Например, DefaultStandardOutput в /etc/systemd/system.conf)-f
было полезно для меня. Следил за журналом, когда происходили изменения (/usr/bin/stdbuf -oL <cmd>
и явнымStandardOutput=journal
. Еще ничего.Короче, проще, не унаследованный ответ:
Где [unitfile] - системное
.service
имя. Например, чтобы увидеть сообщения отmyapp.service
,Чтобы следить за журналами в режиме реального времени:
источник
sudo
если вы получитеNo journal files found
ошибку.