Usb insertでバックグラウンドで実行するスクリプトをudevで実行するのに問題があります。
私のudevルールは、スクリプトを確実に呼び出すため、機能しているように見えますが、私が何をしても、バックグラウンドでbashスクリプトを実行できないため、ブロックされます。
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秒が完了するまでnautilusによってマウントされません。コメントを外すと、udisksctlコマンドでエラーError looking up object for device /dev/usb/adata1
が表示されます。
このスクリプトは、udevではなく、端末から実行すると正常に機能することに注意してください。
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.
source: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
/ etc/udev/rules.d /で接続するときにusbにファイルを書き込む と同様のケースであり、これにも注目してください https://askubuntu.com/a/635477/26246 Fëamartoによる、パーティションがマウントされるまで待つ素敵な再帰トリック。