ubuntuusers.de

Kann udev nur 59s ein Script starten?

Status: Gelöst | Ubuntu-Version: Server 24.04 (Noble Numbat)
Antworten |

matze31

Anmeldungsdatum:
25. Oktober 2015

Beiträge: 788

Hallo, ich habe gerade eine udev-Regel für ein Script geschrieben, und es wurde mir im live syslog angezeigt, dass das bash-Script länger als 59s dauert. Also wäre es richtig ein Dienst (units.service) zu schreiben was dann das Script startet. Die udev startet dann zuerst die Units.

Kann mir jemand sagen wie der offizielle Pfad zum starten einer Units aussieht? Also "RUN+="....."

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7777

Man kann sich um diese udev Kontrolle herummogeln.

Das Script kann z.B. als erstes eine neue Instanz von sich selbst starten, die unabhängig von udev ist (mit setsid, nohup oder disown). Damit entfällt die Zeitbegrenzung.

Es kann auch vorkommen, daß udev ein Script mehrfach startet; wenn es nur einmal laufen soll, braucht man hier noch irgendeinen Locking-Mechanismus. Ganz banal kann man einfach ein Verzeichnis unter /tmp erstellen und abbrechen, wenn es schon existiert.

1
2
3
4
5
6
7
8
9
# script mit setsid neu starten
if [ "${setsid}" != 1 ]
then
  setsid=1 setsid "$0" "$@" &
  exit
fi

# script nur einmalig ausführen
mkdir /tmp/meinscriptname || exit 1

Ansonsten wenn du lieber über systemd gehen willst, kannst du mit RUN+="/usr/bin/systemd-run ..." auch dynamisch eine Unit erzeugen und starten. Das Wiki hat einen Artikel dazu (in der Baustelle): Baustelle/systemd/systemd-run ansonsten die Manpage studieren bzw. andere Beispiele dafür ergoogeln.

Bei einer "richtigen" Systemd-Unit (unter /etc/systemd/system/... Howto/systemd Service Unit Beispiel) brauchst du udev ggf. gar nicht mehr es sei denn dein Script hängt tatsächlich rein von einem udev spezifischen Event ab.

Der Vorteil von Systemd ist natürlich, daß du das Ding dann über Systemd eigenständig neu starten oder beenden bzw. allgemein überwachen kannst. Bei dem obigen Beispiel mit dem Shellscript bleibt dir da nur noch kill...

matze31

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2015

Beiträge: 788

Aha ok, also würde ich den Script-Ausschnitt ganz am Anfang des bash-Script schreiben?

${setsid}" != 1 > überprüft ob das Script läuft

setsid=1 setsid "$0" "$@" & > setzt den Status auf 1 und startet das Script neu.

mkdir /tmp/meinscriptname || exit 1 > heißt es wird in /tmp ein script erstellt mit Exit-code 1

Stimt das so?

Ich habe in Tiefen meines Rechners noch ein "RUN" von Udev für ein Starten von einen Dienst gefunden.

ENV{SYSTEMD_WANTS}="mein.service"

wäre das so richtig?

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7777

mkdir wird hier als lock missbraucht... mkdir auf ein bereits existierendes Verzeichnis schlägt fehl. Somit kannst du das Ding 1000x starten, nur eins kommt durch, alle anderen machen exit...

SYSTEMD_WANTS kannst du probieren wenn du eine feste Unit dafür hast.

matze31

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2015

Beiträge: 788

Vielen dank, das hat funktioniert dank der sehr hilfreichen Antworten. ☺

Antworten |