기본 프로세스가 종료되면 서비스를 다시 시작합니다.

기본 프로세스가 종료되면 서비스를 다시 시작합니다.

나는 사용하고있다연재물 확보장치의 직렬 데이터를 기록합니다. 다음 문서에 제공된 지침에 따라 연속 로깅 서비스를 설정했습니다.연속 녹음

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-successalways

-a또한 에서 삭제하는 경우 에만 작동한다고 지적하셨습니다 grabserial.

관련 정보