Raspbian: problema com o redirecionamento de saída no script do udev

1

O que eu tento alcançar é bem simples.

Sempre que eu conecto um dispositivo bluetooth ao meu Rspberry Pi 3 (executando o Raspbian), um script deve adicionar uma entrada a um arquivo de log.

Simples, porque as coisas difíceis já estão funcionando bem.

Já emparelhei o meu telemóvel e a seguinte regra é acionada sempre que se liga ou desliga:

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'"

No entanto, o resultado é sempre um arquivo de log inexistente e um código de retorno de 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.

Neste ponto, observe que este é um exemplo muito simplificado.

Originalmente, eu tinha um script autônomo que era chamado com sucesso e que tinha como objetivo gravar algumas informações no arquivo de log usando o redirecionamento de eco e saída.

Eu testei vários diretórios de destino e locais do script para teste, mas todos com o mesmo resultado (falha com o código de saída 1).

Quando executo o script na sessão bash atual, ele funciona bem, assim como o comando mencionado na parte superior:

pi@ras-pi:/ $ /bin/bash -c 'echo TEST > /tmp/logfile.log'

Quando eu removo o redirecionamento de saída, para que ele não tente gravar em um arquivo, eu não recebo a mensagem de erro no diário, então eu acho que o script funciona bem e é apenas o redirecionamento que causa o erro. problema. O mesmo é o caso do exemplo original:

KERNEL=="input[0-9]*",RUN+="/bin/bash -c 'echo TEST'"

Claro, meu primeiro palpite foi 'permissões', então este é o diretório tmp:

pi@ras-pi:/ $ ls -la /
(...)
drwxrwxrwt  10 root root  4096 Sep  5 12:54 tmp
(...)

E este é o script que eu estava executando (só para ser completo):

pi@ras-pi:/ $ ls -la /usr/bin/bt_connect
-rwxr-xr-x 1 root root 110 Sep  5 11:36 /usr/bin/bt_connect

Ah, e a propósito: Adicionar sudo não ajuda:

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'"

Que resultados novamente em:

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.

Alguém por favor pode me ajudar a resolver o problema?

Update: Pelo menos eu finalmente encontrei uma maneira de gerar alguma saída para depuração escrevendo não em um arquivo, mas em / dev / kmsg. Este é apenas um exemplo do meu script:

echo $MSGCAT Path=$PATH >> /dev/kmsg

Desta forma, descobri que o script está sendo executado sob o usuário 'root', mas até agora não descobri por que a saída para qualquer arquivo não funciona.

    
por Reinski 05.09.2017 / 13:26

1 resposta

0

No Raspibian, o serviço systemd-udevd provavelmente é executado com o parâmetro systemd ProtectSystem. Isso significa que o udev só poderá gravar em arquivos no diretório / dev. Se você correr

sudo systemctl edit systemd-udevd

ele abrirá um arquivo de texto vazio (a menos que você tenha modificado antes) no editor de texto do sistema (provavelmente nano) no qual você poderá alterar os parâmetros do serviço do udev. De acordo com o link , talvez você queira adicionar

ReadWritePaths=/tmp

para o seu script original (escrevendo para /tmp/logfile.log) funcionar. Você também precisará reiniciar o udevd para que as alterações entrem em vigor

sudo systemctl restart systemd-udevd
    
por 12.03.2018 / 11:00