gelöst- Script-Problem udev rule

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Huck Fin
Beiträge: 1202
Registriert: 10.03.2008 17:10:30

gelöst- Script-Problem udev rule

Beitrag von Huck Fin » 24.01.2018 19:39:15

Hi,
ich habe ein USB Festplattengehäuse, in das ich unterschiedliche Patten stecke.
Beim einstecken soll ein Script testen, welche uuid eingesteckt ist.
Manuell funzt es, aber nicht über Udev rule.

Mein Script liest eine Datei hddids.txt ein, in der die uuid und ein text steht.
also
0000-1234-000 disk1
ich hätte nun gerne, dass dann disk1.sh script gestartet wird.
In der /bin2/USBDISK/disk1.sh ist erst mal nur ein "beep -r5" zum testen.
tut er aber nicht bei udev rule

Manuell geht es, aber bei Aufruf über udev rule nicht.
Meine UDEV Rule

Code: Alles auswählen

SUBSYSTEM=="usb", ACTION=="add", ENV{ID_VENDOR_ID}=="152d", ENV{ID_MODEL_ID}=="2339", RUN+="/bin2/USBDISK/usbdiskx.sh"
Da Script /bin2/USBDISK/usbdiskx.sh

Code: Alles auswählen

#!/bin/bash
#beep -r2
hdid="/bin2/USBDISK/hddids.txt"
while read line line2
do
if [[ -n $(find /dev/disk/by-uuid/ -name "$line") ]]
then echo HDD $line2 $line ist da; /bin2/USBDISK/$line2.sh ; exit; else echo HDD $line2 $line nicht da ;fi
done < $hdid
Der beep -r2 ist zum testen und funzt über udev rule.
Der Rest nur, wenn ich das Script manuell ausführe.

Was mach ich falsch ?
Zuletzt geändert von Huck Fin am 25.01.2018 10:22:30, insgesamt 1-mal geändert.

TomL

Re: Script-Problem udev rule

Beitrag von TomL » 24.01.2018 20:09:13

Nimm zum Testen mal die Filter ID_VENDOR_ID und MODEL_ID raus und füge in das Script als erste Zeile NACH dem Shebang die folgende Zeile ein:

Code: Alles auswählen

/bin/echo "active/started" | systemd-cat -t "$(basename $0)" -p "info"
Und nicht vergessen, nach einer Änderung die Regel zu reloaden. Und bevor Du die Platte/das Gehäuse anstöpselt startest Du zuerst als root in einem Terminal die Journalanzeige:

Code: Alles auswählen

journalctl -f
Wenn Du jetzt die Platte verbindest, müsstest Du den neuen Journaleintrag sehen. Wenn nicht, wird das Script nicht gestartet. Btw, solche Scripte gehören imho nach /usr/local/bin

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Script-Problem udev rule

Beitrag von NAB » 24.01.2018 20:35:00

Ich dachte, die Rule funktioniert und das Script verreckt irgendwo hinter dem "beep -r2"?

Huck Fin, du kannst das beep doch mal hinter das "do" schieben, und dann hinter das "then", um zu schauen, wie weit er kommt.

Macht ein echo in udev eigentlich Ärger? Gibt's da ein stdout?
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Benutzeravatar
Huck Fin
Beiträge: 1202
Registriert: 10.03.2008 17:10:30

Re: Script-Problem udev rule

Beitrag von Huck Fin » 24.01.2018 20:40:53

beep nach dem do funzt.
Es muss was mit den Variablen zu tun haben ?
ein beep nach dem nicht da beept 5 mal, weil ich habe 5 Zeilen beim einlesen.
Manuell findet er eine der UUIDs
udev-rule findet er die UUID nicht

Benutzeravatar
Tintom
Moderator
Beiträge: 3029
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Script-Problem udev rule

Beitrag von Tintom » 24.01.2018 20:53:47

NAB hat geschrieben: ↑ zum Beitrag ↑
24.01.2018 20:35:00
Macht ein echo in udev eigentlich Ärger? Gibt's da ein stdout?
Kam mir auch gerad. Vielleicht mal logger probieren?

Benutzeravatar
Huck Fin
Beiträge: 1202
Registriert: 10.03.2008 17:10:30

Re: Script-Problem udev rule

Beitrag von Huck Fin » 24.01.2018 21:17:39

Der Fehler muss hier liegen
if [[ -n $(find /dev/disk/by-uuid/ -name $line) ]]

Konnte ich soweit eingrenzen...

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Script-Problem udev rule

Beitrag von NAB » 24.01.2018 21:23:29

hmm ... oder er findet die Datei nicht. Da war doch mal was mit udev und eigenem Namespace?
Oder Udev hat das Device noch gar nicht erzeugt?

Was sagt er denn hierzu?

Code: Alles auswählen

#!/bin/bash
#beep -r2
ls /dev/disk/by-uuid/* > /root/debug.txt
hdid="/bin2/USBDISK/hddids.txt"
if [ -r $hdid ]; then
   beep -r2
fi
while ...
Beept er? Was steht danach in /root/debug.txt?
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Benutzeravatar
Huck Fin
Beiträge: 1202
Registriert: 10.03.2008 17:10:30

Re: Script-Problem udev rule

Beitrag von Huck Fin » 24.01.2018 21:30:34

HJabe das Script zum testen geändert.

Code: Alles auswählen

#!/bin/bash
hdid="/bin2/USBDISK/hddids.txt"
while read line line2
do
if [[ -n $(find /dev/disk/by-uuid/ -name $line) ]]
then echo HDD $line2 $line ist da; beep -r2; /bin2/USBDISK/$line2 ; exit; else echo HDD $line2 $line nicht da >> /bin2/USBDISK/log.txt; beep -f100; fi
done < $hdid
Als ergebniss erhalte ich beim einstecken

Code: Alles auswählen

HDD disk-1 8e784037-ffa8-483c-bc67-c40b242512ee nicht da
HDD disk-2 31000ba2-8c3e-4301-9c81-1e795e9a043f nicht da
HDD disk-3 a1127a4e-2cea-4f16-826f-ead1458292a5 nicht da
HDD disk-4 ece19c8b-abb8-42d5-90fd-e3fd48c11642 nicht da
HDD disk-5 ccf0b8a0-26af-4d5a-be29-964de561a6d3 nicht da
Wenn ich manuell starte funzt alles wunderbar...
Also muss es an der Zeile liegen

Code: Alles auswählen

if [[ -n $(find /dev/disk/by-uuid/ -name $line) ]]
weil er falsch auswertet, wenn über udev rule gestartet.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Script-Problem udev rule

Beitrag von NAB » 24.01.2018 21:38:59

Huck Fin hat geschrieben: ↑ zum Beitrag ↑
24.01.2018 21:30:34
weil er falsch auswertet, wenn über udev rule gestartet.
Oder er wertet richtig aus und die Vorannahmen stimmen nicht. Siehe mein Posting dadrüber.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Benutzeravatar
Huck Fin
Beiträge: 1202
Registriert: 10.03.2008 17:10:30

Re: Script-Problem udev rule

Beitrag von Huck Fin » 24.01.2018 21:50:43

Die UUIDs sind genau die, die ich in der Datei hinterlegt habe.
Genau die wirft er in die Log Datei aus.
Wo soll er die dann falsch lesen ???
versteh ich nicht

Habe es auch mal mit test -e versucht.
Gleicher Fehler

Code: Alles auswählen

#!/bin/bash
hdid="/bin2/USBDISK/hddids.txt"
while read line line2
do
if test -e /dev/disk/by-uuid/$line
 then echo HDD $line2 $line ist da
 beep -r2
 /bin2/USBDISK/$line2
 exit
else echo HDD $line2 $line nicht da >> /bin2/USBDISK/log.txt
 beep -f100
fi
done < $hdid
input-datei

Code: Alles auswählen

8e784037-ffa8-483c-bc67-c40b242512ee disk-1
31000ba2-8c3e-4301-9c81-1e795e9a043f disk-2
a1127a4e-2cea-4f16-826f-ead1458292a5 disk-3
ece19c8b-abb8-42d5-90fd-e3fd48c11642 disk-4
ccf0b8a0-26af-4d5a-be29-964de561a6d3 disk-5
log-datei

Code: Alles auswählen

HDD disk-1 8e784037-ffa8-483c-bc67-c40b242512ee nicht da
HDD disk-2 31000ba2-8c3e-4301-9c81-1e795e9a043f nicht da
HDD disk-3 a1127a4e-2cea-4f16-826f-ead1458292a5 nicht da
HDD disk-4 ece19c8b-abb8-42d5-90fd-e3fd48c11642 nicht da
HDD disk-5 ccf0b8a0-26af-4d5a-be29-964de561a6d3 nicht da

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Script-Problem udev rule

Beitrag von NAB » 24.01.2018 22:01:27

Huck Fin hat geschrieben: ↑ zum Beitrag ↑
24.01.2018 21:50:43
Die UUIDs sind genau die, die ich in der Datei hinterlegt habe.
Genau die wirft er in die Log Datei aus.
Wo soll er die dann falsch lesen ???
versteh ich nicht
Ja, hast Recht, das wusste ich aber noch nicht, als ich meinen Beitrag geschrieben habe. Bleibt die Frage, was diese Zeile ausgibt:

Code: Alles auswählen

ls /dev/disk/by-uuid/* > /root/debug.txt
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Benutzeravatar
Huck Fin
Beiträge: 1202
Registriert: 10.03.2008 17:10:30

Re: Script-Problem udev rule

Beitrag von Huck Fin » 24.01.2018 22:04:32

diese
/dev/disk/by-uuid/ccf0b8a0-26af-4d5a-be29-964de561a6d3

TomL

Re: Script-Problem udev rule

Beitrag von TomL » 24.01.2018 22:33:01

Ich empfinde den ganzen Prozess als Über-Kompliziert... man kann einfach den Kernel-Namen in der UDEV-Regel an das Script übergeben (siehe man-page udev: $kernel, %k) und dann mit 2 greps zuerst die UUID rauslesen, z.B.

Code: Alles auswählen

 ls /dev/disk/by-uuid/* | grep sdb1
Mit dem Kernelnamen ist das eigentlich relativ einfach auch direkt die UUID herauszufinden:

Code: Alles auswählen

echo $(basename $(ls -Q /dev/disk/by-uuid/* | grep sda1 | awk -F '"' '{ print $2 }'))
427d-333-468f-a047-06429f4daf0008ac5
und dann mit der UUID weitere Infos via grep aus der Datei hddids.txt lesen.Dann würde ich mal prüfen, ob "$links" in der Udev-Regel nicht sogar direkt die UUID enthält, weil das in /dev/disk/by-uuid auch nur links sind.... dann wärs noch einfacher.

reox
Beiträge: 2459
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Script-Problem udev rule

Beitrag von reox » 24.01.2018 23:24:51

Huck Fin hat geschrieben: ↑ zum Beitrag ↑
24.01.2018 22:04:32
diese
/dev/disk/by-uuid/ccf0b8a0-26af-4d5a-be29-964de561a6d3
auch wenn du das in dem udev script machst?
Ich hab letztens ein udev script geschrieben und mich lang damit geägert das die ausgaben unterschiedlich sind, bis ich den namespace auf shared gesetzt habe: https://unix.stackexchange.com/a/330156

Du kannst ansonsten auch noch probieren die ID's nicht über /dev/ sondern über das Programm blkid zu holen:

Code: Alles auswählen

if [[ -n "$(blkid | grep $name)" ]]; 

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Script-Problem udev rule

Beitrag von NAB » 24.01.2018 23:59:41

Ich weiß auch nicht, wie ich Huck Fins Antwort verstehen soll.
Hier:
viewtopic.php?f=34&t=168404#p1162162
prüft er recht eindeutig, dass /bin2/USBDISK/hddids.txt korrekt gelesen wird, wie er es sich vorstellt.

Aber jeder Durchlauf von:
if test -e /dev/disk/by-uuid/$line
versagt. Warum? Entweder läuft da was ganz dummes mit der Variable schief (ich wüsste nicht was) oder die einfache Antwort ist, dass die gesuchte UUID noch gar nicht existiert.

Versuch's doch mal mit der Idiotenmethode:

Code: Alles auswählen

#!/bin/bash
if test -e /dev/disk/by-uuid/8e784037-ffa8-483c-bc67-c40b242512ee; then beep; fi
if test -e /dev/disk/by-uuid/31000ba2-8c3e-4301-9c81-1e795e9a043f; then beep; fi
if test -e /dev/disk/by-uuid/a1127a4e-2cea-4f16-826f-ead1458292a5; then beep; fi
if test -e /dev/disk/by-uuid/ece19c8b-abb8-42d5-90fd-e3fd48c11642; then beep; fi
if test -e /dev/disk/by-uuid/ccf0b8a0-26af-4d5a-be29-964de561a6d3; then beep; fi
reox, auch dein Link verrät nicht, wie gut oder schlecht das ist, am Udev namespace rumzudrehen ... ich vermute, Poettering wird sich was dabei gedacht haben. Eigentlich soll man die Scripte raus aus Udev in eine Systemd Unit verlegen.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

reox
Beiträge: 2459
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Script-Problem udev rule

Beitrag von reox » 25.01.2018 06:59:43

NAB hat geschrieben: ↑ zum Beitrag ↑
24.01.2018 23:59:41
reox, auch dein Link verrät nicht, wie gut oder schlecht das ist, am Udev namespace rumzudrehen ... ich vermute, Poettering wird sich was dabei gedacht haben. Eigentlich soll man die Scripte raus aus Udev in eine Systemd Unit verlegen.
Mhhh das kann natürlich sein. Ich denke mal, dass diese separation einfach sicherer sein soll, damit man sich mit einer udev rule nicht das system kaputt mounted?
Vllt macht es sogar Sinn, das Script tatsächlich in Systemd auszulagern, so wie ich jetzt gesehen habe ist das auch gar nicht so schwer. Man muss eigentlich nur sein Script als oneshot service anlegen und mit der ENV Variable in der Udev rule starten.
Hier eine schönere Anleitung dazu von CoreOS: https://coreos.com/os/docs/latest/using ... rules.html

Benutzeravatar
Huck Fin
Beiträge: 1202
Registriert: 10.03.2008 17:10:30

Re: Script-Problem udev rule

Beitrag von Huck Fin » 25.01.2018 09:21:36

reox hat geschrieben: ↑ zum Beitrag ↑
24.01.2018 23:24:51
Huck Fin hat geschrieben: ↑ zum Beitrag ↑
24.01.2018 22:04:32
diese
/dev/disk/by-uuid/ccf0b8a0-26af-4d5a-be29-964de561a6d3
auch wenn du das in dem udev script machst?
Ich hab letztens ein udev script geschrieben und mich lang damit geägert das die ausgaben unterschiedlich sind, bis ich den namespace auf shared gesetzt habe: https://unix.stackexchange.com/a/330156

Du kannst ansonsten auch noch probieren die ID's nicht über /dev/ sondern über das Programm blkid zu holen:

Code: Alles auswählen

if [[ -n "$(blkid | grep $name)" ]]; 
Mit

Code: Alles auswählen

if [[ -n "$(blkid | grep $name)" ]];
funktioniert es :THX:
Danke

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: gelöst- Script-Problem udev rule

Beitrag von NAB » 25.01.2018 16:14:10

Dafür hätte ich jetzt gerne noch eine Erklärung, falls einer eine aus dem Ärmel schütteln kann?
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

reox
Beiträge: 2459
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: gelöst- Script-Problem udev rule

Beitrag von reox » 25.01.2018 18:12:49

Mhh tatsächlich namespace separation? Müsste man mal ausprobieren...
Oder das gerät ist in /dev noch nicht da...
Vllt mal ein sleep 5 davorhängen?

reox
Beiträge: 2459
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: gelöst- Script-Problem udev rule

Beitrag von reox » 28.01.2018 15:56:35

Ich hab mein eigenes script jetzt mal auf udev + systemd umgebaut. Das funktionierte out of the box ohne probleme: https://github.com/reox/kodi-discdetect ... 1b4f5ccfe8

Also falls du das probieren magst, ich finde es sogar besser und einfacher als in udev scripte aufrufen :)

Antworten