web-dev-qa-db-fra.com

Le script udev ne fonctionne pas en arrière-plan

Je ne parviens pas à faire exécuter un script par udev en tâche de fond sur usb insert.

Ma règle udev semble fonctionner, car elle appelle définitivement le script, mais quoi que je fasse, je ne parviens pas à exécuter le script bash en arrière-plan. Il est donc bloqué.

Pour référence:

Ma règle d'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"

Mon 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

le script de fond:

#!/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

L'USB n'est pas monté par Nautilus avant que les 10 secondes ne soient écoulées, et la commande udisksctl me donne l'erreur Error looking up object for device /dev/usb/adata1 sans commentaire, ce qui me fait penser que la règle udev n'a même pas fini de créer les liens symboliques.

Notez que le script fonctionne très bien quand je l’exécute depuis mon terminal et pas avec udev

4
WhiteAbeLincoln

RUN ne peut être utilisé que pour des tâches courtes.

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

Vous pouvez utiliser disown pour détacher le processus précédent du shell actuel.

_#!/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
_

C’est un cas similaire à écrire des fichiers en usb lorsqu’il est connecté par /etc/udev/rules.d/ et peut-être devriez-vous vous y intéresser aussi https://askubuntu.com/a/635477/26246 par Fëamarto, Belle astuce récursive qui attend que la partition soit montée.

3
user.dz