Ich habe Probleme mit nicht laufenden udev-Regeln. Hier ist ein Beispiel:
Ich habe eine Regel, /etc/udev/rules.d/99-test.rules
die enthält:
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"
Und hat sayhi
einfach:
#!/bin/bash
date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi
Da es sich um eine Intel-Maschine handelt, habe ich offensichtlich viele Hersteller von 0x8086-PCI-Geräten:
root@imtrobot:~# lspci -n |grep 8086
00:00.0 0600: 8086:2770 (rev 02)
00:02.0 0300: 8086:2772 (rev 02)
00:1d.0 0c03: 8086:27c8 (rev 01)
[ etc. 12 lines total ]
Und doch wird beim Booten /saidhi
entweder gar nichts erstellt oder es werden 1 oder 2 Datumszeilen darin sein.
Wenn nach dem Booten, laufe ich udevadm trigger --action=add --subsystem-match=pci
dann /saidhi
erhalten genau die richtige Anzahl von Terminen hinzugefügt.
Warum funktioniert das während des Startvorgangs nicht?
sleep 30
oder wie lange dies angemessen ist. Oder Sie könnten (möglicherweise?) Abfragen, ob das Verzeichnis mit existiert[ -e / ]
. Ich bin mir nicht sicher, ob du es dir ansehen kannst/
, also vielleicht[ -e /tmp ]
stattdessen.sleep 30
vor derdate
Zeile imsayhi
Skript hatte keine Auswirkung. Vielleicht ist das nicht das Problem./
nicht gemountet, wird das udev-Skript niemals aufgerufen. Booten Sie in x? Vielleicht ist es besser, Skripte auszuführen, wenn die GUI geladen wird?Antworten:
Ich habe tatsächlich einen Weg, der genau die richtige Zeit wartet, keine willkürlichen 30 Sekunden. Ich habe es auf Raspberry Pi gemacht, um alle angeschlossenen USB-Festplatten beim Anschließen, aber auch beim Booten automatisch zu mounten.
Die Regel ähnelt Ihrer:
Jetzt ist das Skript tatsächlich ein rekursiver Aufruf (und ich weiß, dass dies böse ist):
Beachten Sie, dass "grep 'dev / root'" spezifisch für Raspbian OS ist. Unter Ubuntu müssen Sie also Ihr eigenes grep entwerfen, um die rootfs zu erkennen (oder noch besser ein universelles grep). Beachten Sie, dass sich das Skript im Hintergrund aufruft und beendet und nur dann, wenn rootfs "rw" ist, das richtige Mounting-Skript aufruft. Das Skript "/home/pi/bin/usb-automount.sh" übernimmt die eigentliche Bereitstellung oder in Ihrem Fall die Protokollierung.
Beachten Sie, dass die Ausführung dieses Skripts noch 3 Sekunden dauert. Sie können es also weiter optimieren, indem Sie zu Folgendem wechseln:
Ich habe das jedoch nie überprüft und weiß nicht, ob dies wie erwartet funktioniert (ich bin kein Skript-Guru).
quelle
else...
Teil entfernen und nur das lassenif...fi
?Wie von anderen erwähnt, sollten die von
udev
derRUN=
Richtlinie gestarteten Prozesse kurzfristig sein . Ich möchte eine andere einfachere Möglichkeit vorschlagen, um einen lang laufenden Prozess mithilfe des System Scheduler- Befehls zu entkoppeln :udev
at
Stellen Sie einfach sicher, dass Ihr
/sayhi
Skript/bin/sh
kompatibel ist - dies ist die verwendete Shellat
.quelle
Ich habe aus dem gleichen Grund wie @dmd unterrichtet, PCI-Ereignisse kommen vor dem erneuten Mounten des Dateisystems als
rw
. (Aber manchmal kommen einige PCI-Ereignisse nach, Rennbedingung, arbeiten parallel)@ Sparhawk
sleep
Idee scheint mir gut. Ich denke deshalb funktioniert es nicht (Ref :)man udev
:Also habe ich ein neues Skript erstellt, das startet und
disown
das Skript, das densleep
Befehl hat. Eigentlich funktioniert es!quelle