Debian Jessie(Raspberry Pi)에서 자동으로 스크립트를 실행하는 방법(USB 메모리가 연결된 경우)은 무엇입니까?

Debian Jessie(Raspberry Pi)에서 자동으로 스크립트를 실행하는 방법(USB 메모리가 연결된 경우)은 무엇입니까?

나는 라즈베리 파이를 사용하고 있습니다. 이전에는 udev ruleUSB 플래시 드라이브를 연결하면 스크립트를 실행 하곤 했습니다 . 파일의 내용은 다음과 같습니다 /etc/udev/rules.d/10-usbstick.rules.

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1" SYMLINK+="usbflash", RUN+="/path/to/myhup.sh"

그런 다음 myhup.sh:

#!/bin/sh
nohup /path/to/myscript.sh

이 방법은 매우 효과적입니다. USB 플래시 드라이브를 삽입하면 자동으로 파일 실행이 시작됩니다 myscript.sh.

하지만 Jessie로 업그레이드한 후에는 작동하지 않습니다. USB 플래시 드라이브를 삽입할 때 다음 오류가 발생합니다.

[ 2026.652130] sd 0:0:0:0: [sda] No Caching mode page found
[ 2026.652238] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 2029.532163] ntfs: (device sda1): check_mft_mirror(): $MFT and $MFTMirr (record 0) do not match.  Run ntfsfix or chkdsk.
[ 2029.532355] ntfs: (device sda1): load_system_files(): $MFTMirr does not match $MFT.  Mounting read-only.  Run ntfsfix and/or chkdsk.

방법을 사용하기로 결정했습니다 systemd service. 그래서 나는 udev rule그것을 다음과 같이 바꿨습니다.

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1" SYMLINK+="usbflash", RUN+="systemctl start myusb.service"

그리고 myusb.service다음을 생성했습니다:

[Unit]
Description=run myscript
[Service]
Type=oneshot
ExecStart=/path/to/myscript.sh
[Install]
WantedBy=multi-user.target

그런 다음:

sudo chmod 644 /lib/systemd/system/myusb.service
sudo systemctl daemon-reload
sudo systemctl enable myusb.service
sudo reboot

이번에는 다시 작동하지 않았고 다음 오류가 보고되었습니다.

[ 2026.652130] sd 0:0:0:0: [sda] No Caching mode page found
[ 2026.652238] sd 0:0:0:0: [sda] Assuming drive cache: write through

그렇다면 USB 플래시 드라이브가 연결되어 있을 때 Jessie에서 자동으로 스크립트를 실행하려면 어떻게 해야 합니까?

답변1

udev에서 systemd 장치를 실행하려면 이제 장치 이름만 지정하면 됩니다(참고자료 참조 man systemd.device). 예를 들어, (/usr)을 보면 /lib/udev/rules.d/99-systemd.rules다음과 같은 예를 찾을 수 있습니다.

SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_WANTS}+="bluetooth.target"

여기에는 두 가지 중요한 사항이 있습니다. systemd 를 추가해야 하고, 유닛의 (기본) 이름 TAG으로 설정해야 합니다 . SYSTEMD_WANTS사용 규칙이 없으면 SYSTEMD_WANTS해당 버전이 아직 이 기능을 지원하지 않을 수 있습니다.

그래서 귀하의 경우에는

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", SYMLINK+="usbflash", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myusb.service"

udev 규칙에는 쉼표가 없습니다. 귀하가 나열한 2개의 오류는 [sda]참고용일 뿐이며 문제가 아니라는 점에 유의하시기 바랍니다.

관련 정보