스크립트는 udev에 의해 트리거되고 영원히 실행됩니다.

스크립트는 udev에 의해 트리거되고 영원히 실행됩니다.

의 출력을 기록해야 합니다 /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

이전 환경 변수는 더 이상 사용할 수 없으며 매개변수를 통해 가져와야 합니다.

관련 정보