![当主进程退出时重新启动服务](https://linux22.com/image/189672/%E5%BD%93%E4%B8%BB%E8%BF%9B%E7%A8%8B%E9%80%80%E5%87%BA%E6%97%B6%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1.png)
我在用抓取串行记录来自设备的串行数据。我已经按照以下文档中提供的说明设置了连续日志记录服务连续记录
grabserial 工具有一个选项,允许您在输出与给定字符串匹配时退出程序。例如,当grapserial读取以“Exit”开头的行时,以下命令将退出。
grabserial -q "^Exit" -d /dev/ttyUSB0
所以,我的问题是,当主进程grapserial退出时(在检测到串行端口的“Exit”字符串后),如何重新启动服务?
我已阅读有关的文档系统服务并尝试了各种选项,例如KillMode=mixed
等,但没有一个对我有用。使用手动杀死进程sudo kill [PID of grabserial]
会触发服务重新启动,但是当grapserial根据字符串匹配退出时,服务无法重新启动并继续运行。
以下是我的服务文件。我使用了与上面提供的文档相同的服务文件,只是我添加了 -q "^Exits"
参数。
[Unit]
Description=Serial Data Logging Service
After=sys-devices-pci0000:00-0000:00:1c.3-0000:07:00.0-usb3-3\x2d1-3\x2d1:1.0-ttyUSB0-tty-ttyUSB0.device
BindsTo=sys-devices-pci0000:00-0000:00:1c.3-0000:07:00.0-usb3-3\x2d1-3\x2d1:1.0-ttyUSB0-tty-ttyUSB0.device
[Service]
Type=simple
GuessMainPID=no
KillMode=process
Environment=PYTHONIOENCODING=utf-8
ExecStart=/usr/local/bin/grabserial -v -Q -q "^Exit" -d /dev/ttyUSB0 -b 115200 -o "/var/grabserial/LoggingData-%%Y%%m%%d.log" -A
TimeoutSec=2
Restart=on-failure
RestartPreventExitStatus=2 3
StandardInput=null
StandardOutput=syslog
StandardError=syslog+console
SyslogIdentifier=GrabSerial
User=grabserial
Group=grabserial
SupplementaryGroups=dialout
PermissionsStartOnly=true
[Install]
WantedBy=sys-devices-pci0000:00-0000:00:1c.3-0000:07:00.0-usb3-3\x2d1-3\x2d1:1.0-ttyUSB0-tty-ttyUSB0.device
WantedBy=multi-user.target
答案1
所以,我的问题是,当主进程grapserial退出时(在检测到串行端口的“Exit”字符串后),如何重新启动服务?
您可以使用Restart=always
Table 2. Exit causes and the effect of the Restart= settings on them
┌──────────────┬────┬────────┬────────────┬────────────┬─────────────┬──────────┬─────────────┐
│Restart │ no │ always │ on-success │ on-failure │ on-abnormal │ on-abort │ on-watchdog │
│settings/Exit │ │ │ │ │ │ │ │
│causes │ │ │ │ │ │ │ │
├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Clean exit │ │ X │ X │ │ │ │ │
│code or │ │ │ │ │ │ │ │
│signal │ │ │ │ │ │ │ │
├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Unclean exit │ │ X │ │ X │ │ │ │
│code │ │ │ │ │ │ │ │
├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Unclean │ │ X │ │ X │ X │ X │ │
│signal │ │ │ │ │ │ │ │
├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Timeout │ │ X │ │ X │ X │ │ │
├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Watchdog │ │ X │ │ X │ X │ │ X │
└──────────────┴────┴────────┴────────────┴────────────┴─────────────┴──────────┴─────────────┘
既然你已经有了on-failure
并且你想在grabserial
正常存在的情况下重新启动,这意味着你需要添加on-success
条件。 always
非常适合您。
您还指出,这仅在您-a
从 中删除时才有效grabserial
。