script udev não roda em segundo plano

4

Estou tendo problemas para obter um script executado pelo udev para ser executado em segundo plano na inserção do usb.

Minha regra do udev parece funcionar, já que definitivamente chama o script, mas não importa o que eu faça, não consigo executar o script bash em segundo plano, então bloqueia.

Para referência:

Minha regra do udev:

ATTRS{idVendor}=="125f", ATTRS{idProduct}=="db8a", SYMLINK+="usb/adata%n", ENV{XAUTHORITY}="/home/abe/.Xauthority", ENV{DISPLAY}=":0", OWNER="abe", RUN+="/home/abe/bin/usb-adata_udev.sh"

Meu script bash:

#!/bin/bash

if [[ $ACTION == "add" ]]; then
    # I've tried many variations on this, none seem to work
    (su abe /bin/bash -c "/home/abe/Documents/Programs/USB\ Sync/usb-in.sh") &
fi

if [[ $ACTION == "remove" ]]; then
    /home/abe/Documents/Programs/USB\ Sync/usb-out.sh &
fi

o script de fundo:

#!/bin/bash

#echo $ACTION > "/home/abe/Desktop/test.txt"

if [[ ! -d "/media/abe/ABE" ]]; then
    # for testing
    sleep 10
    #udisksctl mount -b /dev/usb/adata1 &> "/home/abe/Desktop/test.txt" 
    #rsync --update /media/abe/ABE/Files/db.kdbx /home/abe/Documents/db.kdbx
    echo "FINISHED" >> "/home/abe/Desktop/test.txt"
fi

O usb não é montado pelo nautilus até que os 10 segundos estejam prontos, e o comando udisksctl me dê o erro Error looking up object for device /dev/usb/adata1 quando descomentado, o que me faz pensar que a regra do udev nem terminou de fazer os links simbólicos .

Note que o script funciona bem quando eu o executo no meu terminal e não no udev

    
por WhiteAbeLincoln 01.09.2015 / 02:00

1 resposta

3

RUN pode ser usado apenas para tarefas curtas.

  

RUN{ type }

...
       This can only be used for very short-running foreground tasks.
       Running an event process for a long period of time may block all
       further events for this or a dependent device.

       Starting daemons or other long running processes is not appropriate
       for udev; the forked processes, detached or not, will be
       unconditionally killed after the event handling has finished.

source: man udev

Você pode usar disown que desanexará esse processo anterior do shell atual.

#!/bin/bash

if [[ $ACTION == "add" ]]; then
    # I've tried many variations on this, none seem to work
    (su abe /bin/bash -c "/home/abe/Documents/Programs/USB\ Sync/usb-in.sh") & disown
fi

if [[ $ACTION == "remove" ]]; then
    /home/abe/Documents/Programs/USB\ Sync/usb-out.sh & disown
fi

É um caso similar ao Escrever arquivos em usb quando conectado por /etc/udev/rules.d/ e pode seja você para olhar para isso também link por Fëamarto, bom truque recursivo que espera até que a partição seja montada.

    
por user.dz 01.09.2015 / 09:44