Я создал простой файл службы 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/messages
делает свое дело. Проблема заключается в том, что, согласно журналам, мой демон падает при запуске, но я могу сказать, что он все еще работает, потому что у него есть HTTP-сервер, и я могу запросить его. Кажется, что остальные журналы теряются ...
StandardOutput=tty
чтобы вы могли видеть, что происходит при запуске демона. Он должен выводить терминал (возможно, вам придется использовать ttyS0
или аналогичный, чтобы получить вывод на ваш экран).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
вывод? Большинство систем будут входить в систему,/var/log/
поэтому я начну с проверки там. Вы можете использоватьgrep
для поиска текста, если вы знаете вывод:grep "my output" /var/log
следует сделать свое дело.