내가 달성하려는 것은 매우 간단합니다.
Bluetooth 장치를 Rspberry Pi 3(Raspbian 실행)에 연결할 때마다 스크립트는 로그 파일에 항목을 추가합니다.
단순히 어려운 일이 이미 잘 진행되고 있기 때문입니다.
휴대폰을 페어링했는데 휴대폰이 연결되거나 연결 해제될 때마다 다음 규칙이 트리거됩니다.
pi@ras-pi:/ $ cat /etc/udev/rules.d/99-input.rules
SUBSYSTEM=="input",GROUP="input",MODE="0660"
KERNEL=="input[0-9]*",RUN+="/bin/bash -c 'echo TEST > /tmp/logfile.log'"
그러나 결과는 항상 존재하지 않는 로그 파일과 1의 반환 코드입니다.
pi@ras-pi:/ $ journalctl -xe -u systemd-udevd
Sep 05 12:54:09 ras-pi systemd-udevd[2333]: Process '/bin/bash -c 'echo TEST > /tmp/logfile.log'' failed with exit code 1.
이 시점에서 이는 매우 간단한 예라는 점에 유의하세요.
처음에는 성공적으로 호출되고 에코 및 출력 리디렉션을 사용하여 로그 파일에 일부 정보를 쓰도록 설계된 독립 실행형 스크립트가 있었습니다.
동일한 결과를 테스트하기 위해 스크립트의 다양한 대상 디렉터리와 위치를 시도했습니다(종료 코드 1로 실패).
현재 bash 세션에서 스크립트를 실행하면 상단에 언급된 명령처럼 잘 작동합니다.
pi@ras-pi:/ $ /bin/bash -c 'echo TEST > /tmp/logfile.log'
출력 리디렉션을 제거하면 파일에 쓰려고 시도하지 않고 로그에 오류 메시지가 표시되지 않으므로 스크립트가 제대로 작동하고 문제를 일으키는 것은 단지 리디렉션일 뿐인 것 같습니다. 원본 예에서도 마찬가지입니다.
KERNEL=="input[0-9]*",RUN+="/bin/bash -c 'echo TEST'"
물론, 내 첫 번째 추측은 "권한"이었으므로 이는 tmp 디렉터리입니다.
pi@ras-pi:/ $ ls -la /
(...)
drwxrwxrwt 10 root root 4096 Sep 5 12:54 tmp
(...)
내가 실행 중인 스크립트는 다음과 같습니다(완전성을 위해).
pi@ras-pi:/ $ ls -la /usr/bin/bt_connect
-rwxr-xr-x 1 root root 110 Sep 5 11:36 /usr/bin/bt_connect
아, 그런데: 추가하는 것은 sudo
도움이 되지 않습니다:
pi@ras-pi:/ $ cat /etc/udev/rules.d/99-input.rules
SUBSYSTEM=="input",GROUP="input",MODE="0660"
KERNEL=="input[0-9]*",RUN+="/bin/bash -c 'sudo echo TEST > /tmp/logfile.log'"
이는 다시 다음과 같은 결과를 낳습니다.
Sep 05 13:13:23 ras-pi systemd-udevd[2398]: Process '/bin/bash -c 'sudo echo TEST > /tmp/logfile.log'' failed with exit code 1.
누구든지 이 문제를 해결하도록 도와줄 수 있나요?
업데이트: 적어도 나는 마침내 파일에 쓰지 않고 /dev/kmsg에 써서 일부 디버그 출력을 생성하는 방법을 찾았습니다. 이것은 내 스크립트의 예일뿐입니다.
echo $MSGCAT Path=$PATH >> /dev/kmsg
이런 식으로 스크립트가 "root" 사용자로 실행되고 있다는 것을 알았지만 지금까지는 파일에 대한 출력이 작동하지 않는 이유를 찾지 못했습니다.
답변1
Raspibian에서 systemd-udevd 서비스는 시스템 매개변수 ProtectSystem을 사용하여 실행될 가능성이 높습니다. 이는 udev가 /dev 디렉토리의 파일에만 쓸 수 있음을 의미합니다. 당신이 달리면
sudo systemctl edit systemd-udevd
udev 서비스의 매개변수를 변경할 수 있는 시스템 텍스트 편집기(대부분 nano)에서 빈(이전에 수정하지 않은 경우) 텍스트 파일이 열립니다. ~에 따르면https://www.freedesktop.org/software/systemd/man/systemd.exec.html당신은 추가하고 싶을 수도 있습니다
ReadWritePaths=/tmp
작동하도록 원본 스크립트(/tmp/logfile.log에 기록)를 가져옵니다. 변경 사항을 적용하려면 udevd를 다시 시작해야 합니다.
sudo systemctl restart systemd-udevd