저는 라즈베리 파이 4 모델 B를 사용하고 있습니다. USB 장치를 연결하면 자동으로 실행되는 스크립트를 만들려고 합니다. USB 장치의 텍스트 파일에서 읽기를 시도합니다.
이것이 내가 지금까지 달성한 것입니다. USB는 udev
내 스크립트를 실행하는 이벤트를 트리거합니다. 이 스크립트에는 루트 권한이 있습니다. 실행되면 ls /media/username
설치된 모든 장치 이후에 실행됩니다.
여기서 몇 가지 문제가 발생합니다. 스크립트(이벤트에 의해 실행될 때 udev
)가 내 USB 장치를 찾을 수 없습니다. 하지만 스크립트를 수동으로 실행하면 작동합니다. 따라서 스크립트는 실패하지 않으며(절대 경로를 사용하고 환경 변수를 사용하지 않음) 터미널에 명령 등을 입력하면 모든 명령이 작동합니다. 권한 문제인 것 같지만 틀릴 수도 있습니다.
답변1
udev
( 보안 허점을 막기 위해 추가된) 프라이빗 마운트 네임스페이스를 비활성화하는 대신 대체 솔루션을 제안하겠습니다 .
먼저, 귀하의 장치와 일치하는 udev 규칙을 생성하고 TAG+="systemd"
추가하세요. 그러면 udev
장치를 단위로 부르라는 systemd
메시지 가 표시됩니다 *.device
.
기본적으로 장치 이름은 장치의 sysfs 경로와 일치하며 슬래시는 대시로 대체됩니다. 즉, 에 있는 경우 해당 ttyS0
장치 장치는 로 표시됩니다 . 이 이름이 마음에 들지 않으면 추가 하여 결정할 수 있는 두 번째 이름을 만드세요./sys
/sys/devices/pnp0/00:01/tty/ttyS0
sys-devices-pnp0-00:01-tty-ttyS0.device
ENV{SYSTEMD_ALIAS}+="<desired device unit name>"
별칭은 여전히 슬래시-대시 프로세스를 거치므로 비슷한 것을 원하는 경우 sys-subsystem-media-devices-somename.device
(다른 하위 시스템이 이미 수행하는 것과 유사) ENV{SYSTEMD_ALIAS}+="/sys/subsystem/media/devices/somename"
.
장치가 *.device
적절한 이름의 장치로 표시 되면 systemd
사용자 정의 스크립트를 지정된 서비스로 전달하여 WantedBy="sys-subsystem-media-devices-somename.device"
장치가 나타날 때 시스템 장치를 시작할 수 있습니다. 스크립트에 루트 액세스가 필요하지 않고 로그인한 사용자가 있을 때만 실행되어야 하는 경우 다음과 같이 설정할 수도 있습니다.사용자 서비스/etc/systemd/user/*.service
즉, 모든 사용자에 대해 정의되거나 ~/.config/systemd/user/*.service
특정 사용자에 대해서만 정의됩니다.
또는 udev 규칙에서 다음 중 하나를 지정하여 udev 규칙에 서비스 종속성을 제공할 수 있습니다.
ENV{SYSTEMD_WANTS}="<system service to start on hotplug>.service"
ENV{SYSTEMD_USER_WANTS}="<user service to start on hotplug>.service"
이는 소프트웨어가 얼마나 모듈화되어 있는지, 사용자에게 얼마나 선택적인지에 따라 udev 규칙과 서비스 간에 책임을 분배하는 다양한 방법을 제공합니다.
- 시스템 서비스에 대한 종속성으로 지정하면 사용자의 로그인 여부에 관계없이 서비스가 트리거되며, 비활성화하려면 해당 서비스를 차단하거나 제거해야 합니다(루트 권한 사용).
- 이것이 사용자 서비스에 대한 udev 지정 종속성으로 지정되면 사용자는 모든 사용자에 대한 기본 사용자 서비스와 함께 루트 권한을 요구하지 않고 서비스를 실행할 수 있는지 여부를 선택할 수 있습니다. 개별 사용자를 위한 -out 메커니즘.
- udev 규칙에서 장치 단위 생성을 위해 udev 옵션만 지정하면 장치가 나타날 때 서비스가 자동으로 시작되도록 선택할 수 있습니다. 이는 서비스 부분을 독립적으로 업데이트하려는 경우 유용할 수 있습니다.