시작 시 장치 경로가 필요한 데몬을 실행하고 있습니다. 장치가 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를 사용하여 서비스를 다시 시작/다시 로드할 수 있습니다.