배경: USB-UART 장치가 연결되면 로깅 스크립트를 시작하고 싶습니다.
내 거 /etc/udev/rules.d/10-local.rules
:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", ATTRS{serial}=="000621000000", SYMLINK+="ttymkw", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}+="offnet-uart-log@$env{ID_SERIAL_SHORT}.service"
내 거:~/.config/systemd/user/[email protected]
[Unit]
Description=Start log of UART
[Service]
ExecStart=sh -c "echo %I >> /tmp/systemd.test"
이것은 나에게 기대되는 가치를 제공하지 않습니다 ID_SERIAL_SHORT
. 대신 매우 긴 시스템 경로를 얻습니다.
sys/devices/pci0000:00/0000:00:1c.0/0000:01:00.0/0000:02:02.0/0000:39:00.0/usb3/3-1/3-1.7/3-1.7.2/3-1.7.2:1.0/tty/ttyACM0
이 경로의 속성을 얻으려고 하면(선행을 제거해야 함 sys
) 다음을 볼 수 있습니다 ID_SERIAL_SHORT
.
$ udevadm info --query=property --path /devices/pci0000:00/0000:00:1c.0/0000:01:00.0/0000:02:02.0/0000:39:00.0/usb3/3-1/3-1.7/3-1.7.2/3-1.7.2:1.0/tty/ttyACM0DEVPATH=//devices/pci0000:00/0000:00:1c.0/0000:01:00.0/0000:02:02.0/0000:39:00.0/usb3/3-1/3-1.7/3-1.7.2/3-1.7.2:1.0/tty/ttyACM0
DEVNAME=/dev/ttyACM0
MAJOR=166
MINOR=0
SUBSYSTEM=tty
USEC_INITIALIZED=1633350773062
[email protected]
ID_BUS=usb
ID_VENDOR_ID=1366
ID_MODEL_ID=1015
ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
ID_PCI_INTERFACE_FROM_DATABASE=XHCI
ID_VENDOR_FROM_DATABASE=SEGGER
ID_MODEL_FROM_DATABASE=DSL6340 USB 3.1 Controller [Alpine Ridge]
ID_VENDOR=SEGGER
ID_VENDOR_ENC=SEGGER
ID_MODEL=J-Link
ID_MODEL_ENC=J-Link
ID_REVISION=0100
ID_SERIAL=SEGGER_J-Link_000621000000
ID_SERIAL_SHORT=000621000000 ### <--- here
ID_TYPE=generic
ID_USB_INTERFACES=:020201:0a0000:ffffff:080650:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=cdc_acm
ID_USB_CLASS_FROM_DATABASE=Miscellaneous Device
ID_USB_PROTOCOL_FROM_DATABASE=Interface Association
ID_PATH=pci-0000:39:00.0-usb-0:1.7.2:1.0
ID_PATH_TAG=pci-0000_39_00_0-usb-0_1_7_2_1_0
ID_MM_CANDIDATE=1
DEVLINKS=/dev/ttymkw /dev/serial/by-id/usb-SEGGER_J-Link_000621000000-if00 /dev/serial/by-path/pci-0000:39:00.0-usb-0:1.7.2:1.0
TAGS=:systemd:
$env{ID_SERIAL_SHORT}
내 udev 규칙의 속성 값으로 대체되지 않는 것 같습니다.
udev의 매뉴얼 페이지에는 $env{key}
대체가 NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE, SECLABEL 및 RUN 필드에만 적용된다고 명시되어 있습니다.
그러나 나는 본 적이 있다그것을 사용하는 사람들의 예존재하다 ENV{SYSTEMD_USER_WANTS}
. 분명히 이것은 나에게 효과가 없습니다.
장치의 일련 번호를 systemd 템플릿에 전달하는 방법은 무엇입니까?
편집 : 나도 시도했다이것,하지만:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", ATTRS{serial}=="000621000000", SYMLINK+="ttymkw", PROGRAM="/bin/systemd-escape -p [email protected] $env{ID_SERIAL_SHORT}", ENV{SYSTEMD_WANTS}+="%c"
답변1
내가 찾고 있는 매개변수는 $attr{serial}
. 10-)가 생성되었습니다. 환경 변수 ID_SERIAL에 대한 규칙 파일은 60-)부터 시작하여 이전에 읽혀졌습니다. 이 작업은 다음과 같습니다.
udev 규칙:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", SYMLINK+="ttymkw", ENV{SYSTEMD_WANTS}+="offnet-uart-log@$attr{serial}"
시스템 템플릿:
[Unit]
Description=Start log of UART for a Offnet unit
[Service]
ExecStart=/bin/sh -c "/bin/echo %i >> /tmp/asdf.log"
분명히 그럴 필요는 없고 사용해야 TAG
합니다 .$attr
$env
시스템 버전은 241입니다.
이것Q&A이것은 나에게 도움이 됩니다.
편집: 작동하지 않는 이유 중 하나는 $env
레벨 ID_SERIAL_SHORT
60 규칙에 따라 생성된 반면 내 파일은 10-local.rules
.감사해요@유와타. (검토되지 않았습니다.)
답변2
또 다른 해결 방법으로 다음과 같은 경우체계서비스가 그 안에서 스크립트를 호출하고 있습니다.실행 시작udevadm
문, 질문에 표시된 것과 동일한 호출을 이 스크립트에 포함하여 ID_SERIAL_SHORT
via를 통해 추출할 수 있습니다 grep
.
답변3
해결 방법으로 udev 규칙에 자체 환경 변수를 만들 수 있습니다.
SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", \
ATTRS{serial}=="000621000000", SYMLINK+="ttymkw", TAG+="systemd", \
ENV{MY_ID}="000621000000", \
ENV{SYSTEMD_USER_WANTS}+="offnet-uart-log@$env{MY_ID}.service"
(가독성을 위해 백슬래시는 한 줄에 있어야 합니다.)
아니면 실제로는 문자열 바로 뒤에 문자열을 쓰세요 @
.
그러나 이것이 꼭 필요한 것은 아닙니다.