Я створив простий файл системного обслуговування для спеціальної програми. Додаток працює добре, коли я запускаю його вручну, але мій процесор отримує maxed, коли я запускаю його з 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 + консолі , системний журнал + консолі або розеткою .
Якщо встановлено для успадкування дескриптор файлу стандартного вводу, дублюється для стандартного виводу. Якщо встановлений на нуль стандартний вихід, буде підключено до нього
/dev/null
, тобто все написане на нього буде втрачено. Якщо встановлено значення tty, стандартний вихід буде підключений до tty (як налаштовано черезTTYPath=
, див. Нижче). Якщо TTY використовується для виведення, тільки виконаний процес не стане контрольним процесом терміналу, і не вийде з ладу або чекати, поки інші процеси звільнять термінал. syslog підключає стандартний вихід до системного реєстратора syslog (3). kmsg з'єднує його з буфером журналу ядра, який доступний через dmesg (1). syslog + консоль і kmsg + консольпрацюйте аналогічно, але також скопіюйте вихід на системну консоль. socket підключає стандартний вихід до сокета від активації сокета, семантика аналогічна відповідній опції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
слід виконати трюк.