Auslösen der Dateikopie beim Einfügen des Geräts (ohne von systemd abhängig)

517
TheChymera

Ich möchte, dass einige Dateien beim Einfügen automatisch von einem Speichergerät kopiert werden. Ich suche nach ein und derselben Methode auf beiden Systemen, die systemd verwenden, und Systemen, die Init-Skripts verwenden (z. B. OpenRC unter Gentoo). Außerdem würde ich versuchen, das Automounting nicht zu unterbrechen.

Ich kann aus vielen anderen Fragen, die sich mit diesem Problem beschäftigen, entnehmen, dass dies am besten über udev erledigt wird, und es funktioniert fast, wenn nicht der udev-Posthook strikt vor dem automount ausgeführt wird (in einer Art und Weise, in der udev den Exit-Status von Skripts überprüft es hat aufgerufen und alle Skripte, die das Skript aufruft, durch einen Prozess, der für mich wie Magie aussieht):

Die Skriptausführung funktioniert nur, weil die Datei nicht kopiert werden kann, da (ich glaube) der Automount-Trigger wartet, bis das Kopierskript zuerst beendet ist:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules  ACTION=="add", KERNEL=="sd?1", ENV=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/4C3D-8BCB.sh" chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh  #!/usr/bin/env bash  touch ~/lalax.txt cp "/run/media/chymera/NIKON D750/lala.txt" ~/ chymera@quiethost ~/.repositorg/transfer $ ls ~/lal* /home/chymera/lalax.txt chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/NIKON\ D750/ DCIM lala.txt NIKON001.DSC 

Das Hinzufügen von Ruhezustand und das Umleiten der Skriptausführung in eine Subshell scheint nicht zu funktionieren. Die Datei wird nicht zugänglich, da das Automount jetzt vollständig gesperrt ist:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules  ACTION=="add", KERNEL=="sd?1", ENV=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/_4C3D-8BCB.sh" chymera@quiethost ~/.repositorg/transfer $ cat _4C3D-8BCB.sh  #!/usr/bin/env bash  nohup /bin/bash /home/chymera/.repositorg/transfer/4C3D-8BCB.sh & exit chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh  #!/usr/bin/env bash  touch ~/lalax.txt sleep 5 cp "/run/media/chymera/NIKON D750/lala.txt" ~/ chymera@quiethost ~/.repositorg/transfer $ ls ~/lal* /home/chymera/lalax.txt chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/ 
0

1 Antwort auf die Frage

1
grawity

Es ist unmöglich, dies nur mit udev (vernünftigerweise) zu implementieren, da udev das Ereignis "Gerät hinzugefügt" erst dann erneut sendet, nachdem alle Regeln und alle Worker auf diesem Gerät beendet wurden. (Und in der Regel löst das Ereignis Automount aus.)

Anstatt auf Geräte zu reagieren, möchten Sie auf neue Halterungen reagieren :

#!/usr/bin/env bash  wanted_dir="/run/media/chymera/NIKON D750"  findmnt -o action,target -r -n --poll | while read -r eaction etarget; do if [[ "$eaction" == mount && "$etarget" == "$wanted_dir" ]]; then cp this that etc. fi done 
Also füge ich das als Service hinzu und lasse es auf Dauer laufen? Ich frage mich immer noch, wie udev verwaiste Prozesse verfolgen kann, die von seinen Arbeitern (sogar in Subshells) gestartet wurden. TheChymera vor 6 Jahren 0