我有一个运行 Debian Jessie 的 Raspberry Pi。
Pi 在我旅行时充当 VPN 网关。
我有一个监控脚本——python——它在触发时生成一个已连接客户端的列表,并通过 MQTT 将该列表发送到我的网络监控机器。这一切都完美无缺。每次我启动脚本时,它都会运行,我可以看到 MQTT 链“另一端”的客户端列表。客户端列表包括来自 VPN 机器的时间戳,显示它是在什么时间触发提供报告的。
我另外配置了一个 Systemd 服务文件,所以我可以自动触发这个脚本。这是我的服务文件 - 'vpnmon.service':
[单元] 说明=VPN 监控脚本 [服务] 类型=简单 ExecStart=/usr/bin/python /home/nick/lib/checkusers.py
这是由 systemd 计时器“vpnmon.timer”触发的:
[单元] 说明=每五秒运行一次 vpnmon 脚本 [定时器] OnBootSec=10s 单位=vpnmon.service OnUnitInactiveSec=5s [安装] WantedBy=multi-user.target
这可以完成所有“工作”。
但是脚本似乎不是定期触发的。有时 10 秒,有时 15 秒,有时 20 秒 - 有时在触发之前整整一分钟过去了。
所以我输入以下内容来查询服务状态:
systemctl status vpnmon.service
我得到了一个很好的结果:
? vpnmon.service - VPN 监控脚本 已加载:已加载(/lib/systemd/system/vpnmon.service;静态) 活动:自 UTC 时间周四 2017-09-28 09:52:01 起不活动(死亡);1 秒前 进程:1138 ExecStart=/usr/bin/python /home/nick/lib/checkusers.py (code=exited, status=0/SUCCESS) 主PID:1138(代码=退出,状态=0/成功)
在做这件事的过程中,我注意到了一件奇怪的事情。如果我反复查询状态,我会不断获得良好的结果,并且我注意到通过像这样通过命令行查询服务状态的行为会导致脚本在预期时准确触发,即以 5 秒的间隔...
查询 …
systemd ×1