сценарий udev не работает в фоновом режиме

Я испытываю затруднения, заставляя скрипт, запущенный udev работать в фоновом режиме на usb, вставляют.

Мое правило udev, кажется, работает, так как оно определенно называет сценарий, но независимо от того, что я делаю, я не могу заставить сценарий удара работать в фоновом режиме, таким образом, оно блокируется.

Для ссылки:

Мое правило 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"

Мой сценарий удара:

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

фоновый сценарий:

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

Usb, не становится смонтированным наутилусом, пока эти 10 секунд не сделаны, и команда udisksctl дает мне ошибку Error looking up object for device /dev/usb/adata1 при некомментарии, который заставляет меня думать, что правило udev даже не закончило делать символьные ссылки.

Обратите внимание, что сценарий работает просто великолепно, когда я выполняю его от своего терминала и не udev

5
задан 31 August 2015 в 17:24

1 ответ

RUN мог использоваться только для коротких задач.

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.

источник: man udev

можно использовать disown, который отсоединит тот предыдущий процесс от текущей оболочки.

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

Это - подобный случай как файлы Записи в usb, когда подключение/etc/udev/rules.d / и может быть Вами для смотрения на этот также https://askubuntu.com/a/635477/26246 FГ «amarto, хороший рекурсивный прием, которые ожидают, пока раздел не смонтирован.

4
ответ дан 23 November 2019 в 09:32

Другие вопросы по тегам:

Похожие вопросы: