새로운 udev "철학"

새로운 udev "철학"

/lib/udev/rules.d내 디렉토리 의 규칙은 다음과 같습니다 .

SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"

다음은 스크립트의 간단한 내용입니다 udev-receiver.sh.

#!/bin/bash

echo "UDEV-RECEIVER INIT" >> /var/log/external.log

{
sleep 5;
echo "Done" >> /var/log/external.log
} &

echo "UDEV-RECEIVER FINISH" >> /var/log/external.log

external.log장치를 연결하면 예상한 대로 출력 됩니다.

UDEV-RECEIVER INIT
UDEV-RECEIVER FINISH
Done

그러나 syslog도 추적하고 있으며 장기 실행 프로세스를 /var/log/syslog분기했음에도 불구하고 장치 초기화가 내 파일에 표시될 때까지 차단된다는 것을 알 수 있습니다 .sleepudevDoneexternal.log

이것이 중요한 이유는 를 통해 일부 장치 속성을 설정하려고 하지만 전체 초기화가 완료될 때까지 ( 에 표시될 때까지 ) xinput장치가 를 통해 나열되지 않기 때문입니다 .xinput listudevDoneexternal.log

에 따르면udev(7) - Linux 매뉴얼 페이지

"특정 장치에 대해 실행할 프로그램 목록에 프로그램을 추가합니다. 이는 매우 짧은 실행 작업에만 사용할 수 있습니다. 장기간 이벤트 프로세스를 실행하면 이 장치 또는 종속 장치에 대한 모든 추가 이벤트가 차단될 수 있습니다. 장기 실행 작업은 이벤트 프로세스 자체에서 즉시 분리되어야 합니다."

매뉴얼 페이지와 내가 보고 있는 동작을 조정할 수 없습니다. 누구든지 xinput장치를 삽입할 때 속성을 설정하는 더 나은 방법을 밝히거나 제공할 수 있습니까 ?

감사해요!

답변1

많은 추가 조사 후에 내 자신의 질문에 대답합니다.

새로운 udev "철학"

분명히 새로운 "적절한" 사용 방법 udev은 장기 실행 프로세스를 발생시키지 않는 것입니다.

을 통해http://blog.fraggod.net/2012/06/16/proper-ish-way-to-start-long-running-systemd-service-on-udev-event-device-hotplug.html:

RUN ... 데몬이나 기타 장기 실행 프로세스를 시작하는 것은 udev에 적합하지 않습니다. 분리 여부에 관계없이 분기된 프로세스는 이벤트 처리가 완료된 후 무조건 종료됩니다.

이것이 OP의 맨페이지 인용과 어떻게 모순되는지 주목하세요.

내 추측으로는 최근 udev변경 사항(~2012년 언젠가)으로 인해 모든 프로세스가 강제로 적용된다는 것입니다.포함이 새로운 철학에 대한 시행 메커니즘으로 실행이 계속되도록 허용하기 전에 분기된 하위 항목을 완료해야 합니다.

따라서 OP의 패턴을 솔루션으로 제공하는 웹에서 쉽게 액세스할 수 있는 모든 문서와 답변이 이제 손상되었습니다.

새로운 장기 실행 패턴 철학은 장치가 연결되어 있을 때 항상 실행되는 일부 데몬에 대해 이야기할 때 이해할 수 있습니다. 그러나 defer이와 함께 효과적인 사용 사례를 제거합니다.

해결 방법

그럼에도 불구하고 해결 방법도 발견했습니다.

/lib/udev/rules.d/98-mouse-config.rules/

SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", ACTION=="add|remove", ENV{ID_TYPE}!="hid", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"

udev-receiver.sh

#!/bin/bash
echo /home/mikeknoop/scripts/mouse.sh | at now

mouse.sh

#!/bin/bash
sleep 3;
export DISPLAY=":0.0"
export XAUTHORITY="/home/mikeknoop/.Xauthority"
/usr/bin/xinput --set-prop 'pointer:Microsoft Microsoft Wireless Optical Mouse® 1.0A' 'Device Accel Constant Deceleration' 2.00000
... more xinput rules here

메모이것은 테스트되었으며 Ubuntu 13.04에서 작동합니다.

메모at다음을 통해 비동기 작업 패키지를 설치해야 합니다.sudo apt-get install at

나는 해결 방법을 함께 모았습니다.https://unix.stackexchange.com/questions/28548/how-to-run-custom-scripts-upon-usb-device-plug-in

관련 정보