我正在使用 Debian 9.8
我有一个运行 dotnet 程序的服务。我想用 monit 来监控它,但在所有示例中,您都需要引用 /var/run 中的 .pid 文件,但我的 dotnet 程序在 /var/run 中没有 .pid 文件。
因此,我将 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
答案1
如果你只是想知道服务是否正在运行,你可以查询 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 ...
注意,systemdPIDFile=
用于告诉 init 在哪里读PID 来自。如果守护进程本身不创建 pidfile,systemd 当然不会费心。如果你真的需要一个,你可以有一个ExecStartPost=/bin/sh -c "echo $MAINPID > /run/testapp.pid"
或类似的东西。
答案2
Monit 也有一个使用正则表达式匹配进程的选项。
因此,首先你要从 shell 中执行以下操作:(用于测试)
monit procmatch 'program'
它将匹配正常运行时间最长的进程。然后您可以在 monit 配置中添加:
check process myprogram matching 'progr.*'
start program = /bin/app
stop program = something..