udev systemd chamada @remove não funciona, mas aciona scripts openSuse Leap42.3

0

Oi eu tenho uma regra UDEV que chama um serviço systemd que desmonta meu drive USB quando ele é removido.

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

O problema é que o serviço systemd não é executado se eu desconectar fisicamente meu drive USB.

Se eu usar a mesma regra de UDEV

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

para executar diretamente /bin/umount -l /extern-backup o comando é executado, mas recebo um erro: udevd[10181]: Process '/bin/umount -l /extern-backup' failed with exit code 32. É por isso que tento executar um serviço systemd porque o comando umount funciona.

Se eu alterar a regra UDEV para executar um script de shell, ele funcionará:

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

O test.sh é executado. Mas eu não posso usar diretamente um script de shell chamado pelo UDEV para executar o comando umount porque ele me dá o mesmo erro que executar /bin/umount -l /extern-backup diretamente do UDEV.

Se eu chamar systemctl start umount_extern_backup.service manualmente, o serviço também funcionará.

Para adicionar o Glacé no bolo, se eu substituir ACTION=="remove" por ACTION=="add", para a regra UDEV, o serviço systemd será executado e tentará desmontar quando eu conectar meu dispositivo USB.

Aqui está o meu serviço systemd:

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

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

[Install]
WantedBy=multi-user.target
    
por Viktor Carlson 14.12.2017 / 11:32

1 resposta

2

RUN+="/usr/bin/systemctl umount_extern_backup.service" como mencionado em um comentário acima dos trabalhos.

Eu verifiquei em SYSTEMD_WANTS propriedade do dispositivo aqui e eles escrevem:

Note that systemd will only act on Wants dependencies when a device first becomes active. It will not act on them if they are added to devices that are already active

Isso explica por que a regra add acionou o serviço systemd e a regra remove não.

    
por 14.12.2017 / 14:25