systemd 서비스가 장치 경로를 파악하고 변경되면 다시 시작하도록 하는 방법이 있습니까?

systemd 서비스가 장치 경로를 파악하고 변경되면 다시 시작하도록 하는 방법이 있습니까?

시작 시 장치 경로가 필요한 데몬을 실행하고 있습니다. 장치가 USB 버스에 연결되어 있지만 때때로 USB 연결이 끊어졌다가 다시 연결되지만(커넥터가 느슨하거나 하드웨어 충돌, 문제가 아직 발견되지 않음) 장치에 다른 이름이 부여됩니다(예: /dev/ttyACM0) /dev/ttyACM1.

AIS 수신기(관심 있는 Quark-elec QK-A022)에서 NMEA 데이터를 출력하는 가상 직렬 포트입니다.

동시에 하나의 장치만 USB에 연결될 것이라고 확신합니다.

특정 유형의 장치가 시스템에 연결되어 있을 때 systemd를 사용하여 서비스를 시작/다시 시작하는 방법이 있습니까? 장치가 거기에 나열되어 있다는 것을 알았 systemctl list-units --type=device기 때문에 기대가 되었지만 지금까지 찾은 모든 예는 명시적으로 servicename@device를 시작하는 것을 기반으로 합니다.

root@ais:/home/pi# systemctl list-units --type=device | fgrep STM
sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.2-1\x2d1.2:1.0-tty-ttyACM1.device                      loaded active plugged STM32F407

동시에 하나의 장치만 USB에 연결될 것이라고 확신합니다.

답변1

오늘날 장치가 연결되었을 때 데몬을 실행하는 표준 방법은 데몬에 대한 systemd 장치를 만들고 장치를 참조하는 장치에 대한 udev 항목을 추가하는 것 같습니다. 예를 들어 /etc/udev/rules.d/90-my.rules다음 줄을 사용하여 파일을 만듭니다.

ACTION=="add", KERNEL=="ttyACM*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myacm@%k.service"

그리고 파일/etc/systemd/system/[email protected]

[Unit]
Description=my serial daemon for ttyACM0
[Service]
ExecStart=/bin/myscript %i

sudo udevadm control --reload및 가 필요할 수 있습니다 sudo systemctl daemon-reload. 장치를 연결하면 스크립트가 매개변수를 사용하여 실행되어야 합니다( ttyACM0이것이 매개변수라고 불리는 경우). 로그 파일에서 오류를 확인하세요.

man 7 daemon섹션을 참조하세요새로운 데몬 프로세스그리고장치 기반 활성화, 또한 man systemd.device.

답변2

systemd에서 이 작업을 수행할 수 있는지는 모르겠지만 장치 변경이 감지되면 udev를 사용하여 서비스를 다시 시작/다시 로드할 수 있습니다.

관련 정보