Я использую Debian 9.8

У меня есть сервис, который запускает мою программу dotnet. Я хотел бы отслеживать это с помощью monit, но во всех примерах вам нужно ссылаться на файл .pid в /var /run, но моя программа dotnet не имеет файла .pid в /var /run.

Поэтому я добавил PIDFile =/var/run/testservice.pid в файл .service для моей службы, но он не создает файл при запуске.

Вот где я нахожусь

это мой файл .service

[Unit]
Description=Test Service
Wants=network-online.target influxdb.service
After=network-online.target influxdb.service

[Service]
User=testservice
Group=mainapp
SyslogIdentifier=testservice
PIDFile=/var/run/testservice.pid

Restart=on-failure
TimeoutStopSec=5
RestartSec=10

ExecStart=/usr/bin/dotnet /mainapp/app/TestSystemdService.dll

[Install]
WantedBy=multi-user.target

2 ответа2

2

Если вам нужно знать, работает ли служба, вы можете запросить systemd:

systemctl is-active TestApp.service

Вы также можете проверить, неактивен ли он именно из-за известного сбоя:

systemctl is-failed TestApp.service

Согласно документации, это может быть включено в monit как check program … with path:

check program TestApp with path "systemctl --quiet is-active TestApp"
    if status != 0 then ...

Обратите внимание, что systemd PIDFile= предназначен для указания init, откуда читать PID. Если сам демон не создает pid-файл, systemd определенно не будет беспокоиться. Если вам это действительно нужно, у вас может быть ExecStartPost=/bin/sh -c "echo $MAINPID > /run/testapp.pid" или что-то подобное.

1

У Monit есть опция для сопоставления процессов с использованием регулярных выражений.

Итак, сначала вы должны сделать из оболочки: (для тестирования)

monit procmatch 'program'

Это будет соответствовать процессу с самым высоким временем безотказной работы. Затем вы можете добавить в конфигурацию monit:

check process myprogram matching 'progr.*'
     start program = /bin/app
     stop program = something..

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .