의 출력을 기록해야 합니다 /dev/ttyUSB0
. 이것이 연결에서 시작 로그 스크립트를 시작하는 방법입니다.
pi@raspberrypi:/etc/udev/rules.d $ cat 50-text-log.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", RUN+="/bin/bash /scripts/start-log"
/dev/ttyUSB0 > somefile
/dev에서 경로를 찾는 것 외에도 기본적으로 수행하는 작업은 cat입니다.
하지만 이로 인해 이 메시지가 표시됩니다.service udev status
raspberrypi systemd-udevd[4990]: Spawned process '/bin/bash /scripts/start-log' [5018] is taking longer than 59s to complete
나는 이것을 시도했습니다 :Udev 이벤트에서 긴 프로세스를 실행하는 방법은 무엇입니까?
이중 포크를 사용하면 이미 8초 후에 중지되어 상황이 더욱 악화됩니다. 다음과 같이 cgroup을 변경합니다. ( echo $$ >> /sys/fs/cgroup/cpu/tasks
위 링크에 설명된 내용을 bash에서 복사해 보세요.) 아무 것도 변경되지 않으며 8초 후에도 그대로 유지됩니다.
USB 장치가 연결될 때 영구적으로 실행되는 스크립트를 시작하려면 어떻게 해야 합니까?
/etc/systemd/system
아니면 ("장치 단위")에서 .device 파일을 사용하여 이를 수행하려면 어떻게 해야 합니까 ? 이에 대한 정보가 너무 적습니다.
답변1
이 문제는 systemd 서비스를 사용하여 마침내 해결되었습니다.
59초 이상 실행되지 않는 이전 콘텐츠는 다음과 같습니다.
이전 udev 규칙
고양이/etc/udev/rules.d/50-text-log.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", RUN+="/bin/bash /scripts/start-log"
오래된 스크립트
/스크립트/startlog
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
cat "${DEVICE}" >> somefile
이제 15분 정도 실행되었습니다.
새로운 udev 규칙
고양이/etc/udev/rules.d/50-text-log.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ENV{SYSTEMD_WANTS}="log@$env{DEVPATH}.service"
$env{DEVPATH}는 $1 bash 변수의 일반 명령줄 인수로 서비스에 전달됩니다.
새로운 서비스
/etc/systemd/system/[이메일 보호됨]
[Service]
Type=simple
TimeoutSec=0
GuessMainPID=false
ExecStart=/bin/bash -c "/scripts/start-log %I"
또는 를 사용할 수도 있습니다 TimeoutSec=infinity
. 이는 영구 실행 설정의 최신 변형인 것 같습니다. 그러나 =0
그것이 나에게 효과가 있었기 때문에 나는 그것을 시도하지 않았습니다. ( 약어를 통해 구성을 확인 man systemd.service
하고 계속 진행하세요 ). 아직 재부팅해야 할 것 같아요.TimeoutStopSec=
TimeoutSec=
새 스크립트
DEVPATH=$1
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
cat "${DEVICE}" >> somefile
이전 환경 변수는 더 이상 사용할 수 없으며 매개변수를 통해 가져와야 합니다.