@remove를 호출하는 udev systemd는 작동하지 않지만 openSuse Leap42.3 스크립트를 트리거합니다.

@remove를 호출하는 udev systemd는 작동하지 않지만 openSuse Leap42.3 스크립트를 트리거합니다.

안녕하세요, USB 드라이브가 제거되면 마운트 해제하는 시스템 서비스를 호출하는 UDEV 규칙이 있습니다.

ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", ENV{SYSTEMD_WANTS}="umount_extern_backup.service"

문제는 USB 드라이브를 물리적으로 분리하면 systemd 서비스가 실행되지 않는다는 것입니다.

동일한 UDEV 규칙을 사용하는 경우

ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/bin/umount -l /extern-backup"

명령을 직접 실행하면 /bin/umount -l /extern-backup실행되지만 오류가 발생합니다. udevd[10181]: Process '/bin/umount -l /extern-backup' failed with exit code 32.umount 명령이 작동하기 때문에 systemd 서비스를 실행하려고 합니다.

쉘 스크립트를 실행하기 위해 UDEV 규칙을 변경하면 다음과 같이 작동합니다.

ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/usr/local/sbin/test.sh"

test.sh가 실행됩니다. 하지만 UDEV에서 호출한 쉘 스크립트를 사용하면 명령을 직접 실행할 수 없습니다. umountUDEV에서 직접 실행할 때와 동일한 오류가 발생하기 때문입니다 /bin/umount -l /extern-backup.

서비스를 수동으로 호출하는 경우 systemctl start umount_extern_backup.service에도 작동합니다 .

케이크에 아이싱을 추가하기 위해 UDEV 규칙을 로 ACTION=="remove"바꾸면 ACTION=="add",systemd 서비스가 실행되고 USB 장치를 연결할 때 제거를 시도합니다.

이것은 내 시스템 서비스입니다.

[Unit]
Description=umount lazy /extern-backup service

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/bin/umount -l /extern-backup

[Install]
WantedBy=multi-user.target

답변1

RUN+="/usr/bin/systemctl umount_extern_backup.service"위의 의견에서 언급했듯이 작동합니다.

SYSTEMD_WANTS장치 속성을 확인했습니다여기그들은 썼다:

systemd는 장치에 종속성이 필요한 경우에만 작동합니다. 먼저 활발하게 활동하다. 이미 활성화된 장치에 추가된 경우에는 작동하지 않습니다.

이는 이 add규칙이 systemd 서비스를 트리거했지만 이 remove규칙은 트리거하지 않은 이유를 설명합니다.

관련 정보