나는 사용하고있다연재물 확보장치의 직렬 데이터를 기록합니다. 다음 문서에 제공된 지침에 따라 연속 로깅 서비스를 설정했습니다.연속 녹음
Grabserial 도구에는 출력이 지정된 문자열과 일치하는 경우 프로그램을 종료할 수 있는 옵션이 있습니다. 예를 들어 Grapserial이 "Exit"로 시작하는 줄을 읽으면 다음 명령이 종료됩니다.
grabserial -q "^Exit" -d /dev/ttyUSB0
그래서 내 질문은 기본 프로세스 grpserial이 종료될 때(직렬 포트의 "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
그래서 내 질문은 기본 프로세스 grpserial이 종료될 때(직렬 포트의 "Exit" 문자열을 감지한 후) 서비스를 어떻게 다시 시작합니까?입니다.
당신은 그것을 사용할 수 있습니다Restart=always
man systemd.service
보여주다:
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
.