Seltsames im Skript angestossen über udev-Regel
Seltsames im Skript angestossen über udev-Regel
Auf meinem QNAP-NAS läuft seit Jahren eine Debian-Installation aktuell mit Buster (letzte für QNAP unterstützte).
Ich führe ein neues Skript über udev-Regel aus, wenn ich einen bestimmten USB-Stick anschließe. Der Stick wird auch erkannt und das Skript auch ausgeführt.
Im Skript nutze ich u.a. touch und date aus dem Paket coreutils. Führe ich touch für eine neu zu erstellende Datei aus, so erhält sie als Erstellungsdatum den 14.02.19. Führe ich date +%d > heute aus, so enthält "heute" 14 und nicht 16 (heute ist der 16.09.21).
Führe ich die Befehle nicht über das Skript aus der udev-Regel sondern im Terminal aus, so sind die Ergebnisse richtig: 16.09.21 und 16.
Ich habe inzwischen die Aufgabe, die das Skript erledigen sollte, anderweitig gelöst. Trotzdem würde ich gerne wissen, was hier falsch läuft.
Hat jemand eine Idee oder Anregung? Hierfür danke.
Gruss H.
Ich führe ein neues Skript über udev-Regel aus, wenn ich einen bestimmten USB-Stick anschließe. Der Stick wird auch erkannt und das Skript auch ausgeführt.
Im Skript nutze ich u.a. touch und date aus dem Paket coreutils. Führe ich touch für eine neu zu erstellende Datei aus, so erhält sie als Erstellungsdatum den 14.02.19. Führe ich date +%d > heute aus, so enthält "heute" 14 und nicht 16 (heute ist der 16.09.21).
Führe ich die Befehle nicht über das Skript aus der udev-Regel sondern im Terminal aus, so sind die Ergebnisse richtig: 16.09.21 und 16.
Ich habe inzwischen die Aufgabe, die das Skript erledigen sollte, anderweitig gelöst. Trotzdem würde ich gerne wissen, was hier falsch läuft.
Hat jemand eine Idee oder Anregung? Hierfür danke.
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Die einfachste Lösung ist wahrscheinlich, dass auf deinem QNAS das Datum falsch eingestellt ist und glaubt tatsächlich 2 Tage in der Vergangenheit zu sein.
Gibt dir das aktuell eingestellte Datum zurück.
Wenn hier der 14. September 2021 zurückkommt, dann solltest du das Problem relativ einfach mit einem:
beheben können. Einfach danach mit dem "date" Befehl anschießend überprüfen ob Uhrzeit und Datum dann korrigiert worden sind.
p.s.
Wer genau lesen kann ist klar im Vorteil... guck doch mal ob es Unterschiede gibt bei der Ausgabe der folgenden Befehle gibt:
gibt. Also abhängig davon ob über Terminal oder per UDEV-Rule ausgeführt.
Code: Alles auswählen
date
Wenn hier der 14. September 2021 zurückkommt, dann solltest du das Problem relativ einfach mit einem:
Code: Alles auswählen
sudo ntpdate-debian
p.s.
Wer genau lesen kann ist klar im Vorteil... guck doch mal ob es Unterschiede gibt bei der Ausgabe der folgenden Befehle gibt:
Code: Alles auswählen
timedatectl
hwclock -r
He who work root can fell trees and knowledge is no substitute for experience.
Re: Seltsames im Skript angestossen über udev-Regel
Nein, das Datum ist richtig eingestellt, wie sich ja darin zeigt, dass date im Terminal das richtige Datum zeigt.minuseins hat geschrieben:16.09.2021 18:42:37Die einfachste Lösung ist wahrscheinlich, dass auf deinem QNAS das Datum falsch eingestellt ist und glaubt tatsächlich 2 Tage in der Vergangenheit zu sein ...
Auch zeigt sich heute am 17.09.21 in date +%d der Tag 14, also 3 Tage zurück.
Da auch das Datum beim touch heute wieder den 14.02.19 zeigt, vermute ich dass vielleicht das Paket coreutils für die Architektur armel in Buster vom 14.02.19 stammt. Eine Begründung kann ich mangels tiefer gehenden Wissens nicht liefern.
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Und was ist die Ausgabe der anderen beiden Befehle? Also "hwclock -r" und "timedatectl"?
Gibt es da auch Unterschiede?
Gibt es da auch Unterschiede?
He who work root can fell trees and knowledge is no substitute for experience.
Re: Seltsames im Skript angestossen über udev-Regel
hwclock -r zeigt im Skript, welches über die udev-Regel angestossen wird, das richtige Datum. Auch im Terminal zeigt es dieses Datum.
timedatectl zeigt in o.a. Skript keine Ausgabe. Auf stderr wird ausgegeben "Failed to create bus connection: No such file or directory". Im Terminal zeigt es das richtige Datum.
Gruss H.
timedatectl zeigt in o.a. Skript keine Ausgabe. Auf stderr wird ausgegeben "Failed to create bus connection: No such file or directory". Im Terminal zeigt es das richtige Datum.
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Wie? Also so:halo44 hat geschrieben:17.09.2021 10:04:32Auch zeigt sich heute am 17.09.21 in date +%d der Tag 14, also 3 Tage zurück.
Code: Alles auswählen
$ date
Sun 19 Sep 2021 11:34:39 AM CEST
$ date +%d
14
Code: Alles auswählen
$ LANG=C date +%d
In jedem Fall klingt das eher nach Bugreport schreiben...
Re: Seltsames im Skript angestossen über udev-Regel
Im Eingangspost ist eigentlich bereits alles gesagt. Wie dort schon ausgeführt, wird auf dem NAS ein Skript über udev-Regel angestossen. In diesem Skript führe ich aus
Der Inhalt von heute ist 14
Der Inhalt von heute ist jetzt Thu Feb 14 11:12:08 CET 2019
Öffne ich über ssh auf dem NAS ein Terminal und führe die Befehle im Terminal aus erhalte ich die richtigen Werte vom heutigen Tage.
Auch zeigt das gleiche Verhalten.
Gruss H.
Code: Alles auswählen
date +%d > heute
Code: Alles auswählen
date > heute
Öffne ich über ssh auf dem NAS ein Terminal und führe die Befehle im Terminal aus erhalte ich die richtigen Werte vom heutigen Tage.
Auch
Code: Alles auswählen
LANG=C date +%d
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Weil du schriebst, dass im Terminal die richtige Uhrzeit angezeigt wird, ich dachte du hast das auch mit date angesehen.
Und date ist bei dir auch das richtige executable?
edit: Was ich mir jetzt auch noch gedachte habe: date holt ja die zeit per time.h und da gibts teilweise solche berichte: https://stackoverflow.com/questions/344 ... 35959-1969
Offenbar bekommst du ja auch immer die selbe Zeit zurückgeliefert.
Vermutlich holen sich Tools auf der commandline die zeit woanders her, zB von systemd.
Evt hast du da ein ähnliches Problem.
Und date ist bei dir auch das richtige executable?
edit: Was ich mir jetzt auch noch gedachte habe: date holt ja die zeit per time.h und da gibts teilweise solche berichte: https://stackoverflow.com/questions/344 ... 35959-1969
Offenbar bekommst du ja auch immer die selbe Zeit zurückgeliefert.
Vermutlich holen sich Tools auf der commandline die zeit woanders her, zB von systemd.
Evt hast du da ein ähnliches Problem.
Re: Seltsames im Skript angestossen über udev-Regel
Wie sieht denn die udev-Regel aus? Und wie das Skript, das aufgerufen wird?
Vielleicht änderst du einmal testweise den Aufruf des Skripts in RUN+="/bin/bash -c '/bin/date > /tmp/datum'", damit du auch sicher sein kannst, dass dein Skript nicht durch falsche Binaries oder relative Pfade gestört wird.
Vielleicht änderst du einmal testweise den Aufruf des Skripts in RUN+="/bin/bash -c '/bin/date > /tmp/datum'", damit du auch sicher sein kannst, dass dein Skript nicht durch falsche Binaries oder relative Pfade gestört wird.
Re: Seltsames im Skript angestossen über udev-Regel
Kannst du den Befehl nicht nutzen?halo44 hat geschrieben:hwclock -r zeigt im Skript, welches über die udev-Regel angestossen wird, das richtige Datum. Auch im Terminal zeigt es dieses Datum.
Z. B. so:
Code: Alles auswählen
hwclock -r|awk {'print $2'}
Re: Seltsames im Skript angestossen über udev-Regel
Danke für Eure Antworten. Ich werde die Fragen jeweils in eigenen Beiträgen beantworten, weil ich für alle Änderungen das NAS neu starten und mich per per ssh aufschalten muss. Das dauert. Später werde ich noch über weitere Merkwürdigkeiten das mysteriöse Datum 14.02.2019 betreffend berichten.
Zunächst zu @Tintom. Die udev-Regel lautet
Die beiden ersten Befehle des Skripts /usr/local/bin/unlock-luks-0
Die Datei heute zeigt jetzt 14, die Datei heute-lang zeigt Thu Feb 14 11:12:08 CET 2019.
Den Aufruf für RUN+ werde ich später mal durchführen, nach Änderung und Neustart des NAS.
Gruss H.
Zunächst zu @Tintom. Die udev-Regel lautet
Code: Alles auswählen
SUBSYSTEM=="block", ACTION=="add", ENV{ID_MODEL}=="Flash_Disk", ENV{ID_VENDOR}=="Generic", ENV{ID_SERIAL_SHORT}=="66F8C741", SYMLINK+="usbstick", RUN+="/bin/sh /usr/local/bin/unlock-luks-0"
Code: Alles auswählen
#!/bin/bash
/bin/date +%d > /home/hanswerner/heute
/bin/date > /home/hanswerner/heute-lang
......
Den Aufruf für RUN+ werde ich später mal durchführen, nach Änderung und Neustart des NAS.
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Natürlich könnte ich auch diesen Befehl nutzen. Deswegen aber darf date keine falschen Ergebnisse liefern.uname hat geschrieben:20.09.2021 12:58:03Kannst du den Befehl nicht nutzen?halo44 hat geschrieben:hwclock -r zeigt im Skript, welches über die udev-Regel angestossen wird, das richtige Datum. Auch im Terminal zeigt es dieses Datum.
Z. B. so:Im Script solltest du im übrigen überall vollständige Pfade nutzen wie z. B. /bin/date (coreutils) oder /sbin/hwclock (util-linux).Code: Alles auswählen
hwclock -r|awk {'print $2'}
Vollständige Pfade nutze ich (siehe vorherigen Post mit Inhalt der udev-Regel und Skript).
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Das ist tatsächlich ein hochinteressanter Link. Werde die dort geposteten Lösungen später mal durchprobieren.reox hat geschrieben:20.09.2021 07:35:40... Was ich mir jetzt auch noch gedachte habe: date holt ja die zeit per time.h und da gibts teilweise solche berichte: https://stackoverflow.com/questions/344 ... 35959-1969 ...
Im Eröffnungsbeitrag habe ich ja schon erwähnt, dass nicht nur date im Skript den 14.02.2019 zeigt sondern auch mit touch erstellte Dateien das gleiche falsche Datum zeigen.
Inzwischen habe ich weitere Merkwürdigkeiten ohne Bezug zur udev-Regel festgestellt. Diese zeigen sich im Terminal.
Prüfe ich die Datenpartitionen auf dem NAS auf mount- und prüf-Vorgänge, so zeigen alle Partitionen ebenfalls das Datum 14.02.2019, allerdings mit unterschiedlichen Uhrzeiten.
Code: Alles auswählen
root@NAS-01:~# tune2fs -l /dev/sda8 | egrep -i "Last"
Last mounted on: /Daten-Filme
Last mount time: Thu Feb 14 11:12:37 2019
Last write time: Thu Feb 14 11:12:37 2019
Last checked: Thu Feb 14 11:12:25 2019
root@NAS-01:~# tune2fs -l /dev/sda6 | egrep -i "Last"
Last mounted on: /Daten-2
Last mount time: Thu Feb 14 11:12:10 2019
Last write time: Thu Feb 14 11:12:10 2019
Last checked: Thu Feb 14 11:12:07 2019
root@NAS-01:~# tune2fs -l /dev/sda5 | egrep -i "Last"
Last mounted on: /Daten-1
Last mount time: Thu Feb 14 11:12:24 2019
Last write time: Thu Feb 14 11:12:24 2019
Last checked: Thu Feb 14 11:12:10 2019
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Du könntest mal mit strace die wirklich große Keule rausholen.
Auf der Kommandozeile:
Datei lautet dann irgendwie terminal.txt.<prozessid>
Im Script:
Datei lautet dann irgendwie script.txt.<prozessid>
Gibt es Unterschiede?
Kannst du dir in dem Zusammenhang gleich mitanschauen, welches ich nin meiner Terminal-Version gefunden habe.
Code: Alles auswählen
/usr/bin/strace -ff -o out.txt /bin/date
Code: Alles auswählen
/usr/bin/strace -ff -o terminal.txt /bin/date
Im Script:
Code: Alles auswählen
#!/bin/bash
/bin/date +%d > /home/hanswerner/heute
/bin/date > /home/hanswerner/heute-lang
/usr/bin/strace -ff -o script.txt /bin/date
......
Gibt es Unterschiede?
Code: Alles auswählen
zdump /etc/localtime
Zuletzt geändert von uname am 20.09.2021 15:51:09, insgesamt 2-mal geändert.
Re: Seltsames im Skript angestossen über udev-Regel
Weiter oben hat schon jemand geschrieben: Kannst du bitte einmal die Ausgabe von timedatectl (aus dem Terminal, nicht durch udev-Skript) posten?
Re: Seltsames im Skript angestossen über udev-Regel
Also die Dateien sind an einigen Stellen unterschiedlich, allerdings zeigt sich wohl der entscheidende Unterschied in der 5.Zeile vor dem Ende der Datei.
In der Terminal-Ausgabe:
Gruss H.
In der Terminal-Ausgabe:
In der Skript-Ausgabe:write(1, "Mo 20. Sep 15:53:00 CEST 2021\n", 30) = 30
Wird die komplette Ausgabe trotzdem noch benötigt?write(1, "Thu Feb 14 11:12:09 CET 2019\n", 29) = 29
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Das zeigt im NAS-Terminal jetztTintom hat geschrieben:20.09.2021 15:47:47Weiter oben hat schon jemand geschrieben: Kannst du bitte einmal die Ausgabe von timedatectl (aus dem Terminal, nicht durch udev-Skript) posten?
Code: Alles auswählen
Local time: Mo 2021-09-20 17:17:06 CEST
Universal time: Mo 2021-09-20 15:17:06 UTC
RTC time: Mo 2021-09-20 15:17:06
Time zone: Europe/Berlin (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
Re: Seltsames im Skript angestossen über udev-Regel
Der interessante teil ist wohl, was der unterschied von clock_gettime isthalo44 hat geschrieben:20.09.2021 17:16:22Wird die komplette Ausgabe trotzdem noch benötigt?
Gruss H.
aber poste mal bitte alles, das sollte ja auch nicht lang sein!
Re: Seltsames im Skript angestossen über udev-Regel
das ist echt oarg, tatsächlich liefert das ein anderes datum zurück:
Da kann ich mir überhaupt keinen reim drauf machen... wieso sollte das einmal tatsächlich das richtige datum liefern und mal nicht?!
offenbar wird auf der konsole noch /usr/lib/locale/locale-archive gelesen - was das für einen Unterschied macht versteh ich nicht - weil dann solte es ja mit LANG=C auch das resultat geben...
Auf die schnelle hab ich einen bug gefunden der so ähnlich klingt: https://git.kernel.org/pub/scm/linux/ke ... 2c3baa3ae4
evt ist das auch sowas und das lesen der datei verhindert, dass der Wert verwendet wird.
Kannst du probieren einen neueren Kernel zu verwenden? ggf ist das Problem im Kernel schon gelöst
Code: Alles auswählen
clock_gettime(CLOCK_REALTIME, {tv_sec=1550139129, tv_nsec=265725895}) = 0
offenbar wird auf der konsole noch /usr/lib/locale/locale-archive gelesen - was das für einen Unterschied macht versteh ich nicht - weil dann solte es ja mit LANG=C auch das resultat geben...
Auf die schnelle hab ich einen bug gefunden der so ähnlich klingt: https://git.kernel.org/pub/scm/linux/ke ... 2c3baa3ae4
evt ist das auch sowas und das lesen der datei verhindert, dass der Wert verwendet wird.
Kannst du probieren einen neueren Kernel zu verwenden? ggf ist das Problem im Kernel schon gelöst
Re: Seltsames im Skript angestossen über udev-Regel
Eine ganz banale Vermutung von mir: Du schreibst, du startest das System bei allen Änderungen neu. Kann es sein, dass das System die Uhrzeit beim Neustart vergisst (Batterie leer?)?
Nach dem Neustart beginnt das System zeitlich beim Urknall, hier also der 14.02. Diese Uhrzeit wird zunächst als Basis für die Systemzeit genommen. Während des Bootvorgangs wird dein udev-Skript abgearbeitet, wahrscheinlich jedoch bevor systemd-timesyncd sich die aktuelle Zeit aus dem Internet geholt hat. Sobald du dich eingeloggt hast, hat sich das System bereits eine Uhrzeit besorgt (siehe Ausgabe von timedatectl).
Was passiert, wenn du die Udev-Regel ausführst (d.h. den Stick einsteckst) nachdem du dich angemeldet hast und das System sich zeitlich synchronisiert hat (mit timedatectl vorher prüfen!)? Ändert das etwas?
Re: Seltsames im Skript angestossen über udev-Regel
Dann müssten aber die Sekunden weitergezählt werden und wenn ich das richtig verstehe, kommt dort immer der selbe TImestamp zurück - oder nicht?
Re: Seltsames im Skript angestossen über udev-Regel
Dass die Batterie leer ist, kann ich ausschließen. Ich schalte mein NAS spätabends per Cronjob aus. Hierbei vermittle ich dem NAS, dass es am nächsten Tag um 17:05 Uhr neu starten soll:Tintom hat geschrieben:21.09.2021 12:15:38... Eine ganz banale Vermutung von mir: Du schreibst, du startest das System bei allen Änderungen neu. Kann es sein, dass das System die Uhrzeit beim Neustart vergisst (Batterie leer?)?
Nach dem Neustart beginnt das System zeitlich beim Urknall, hier also der 14.02. Diese Uhrzeit wird zunächst als Basis für die Systemzeit genommen. Während des Bootvorgangs wird dein udev-Skript abgearbeitet, wahrscheinlich jedoch bevor systemd-timesyncd sich die aktuelle Zeit aus dem Internet geholt hat. Sobald du dich eingeloggt hast, hat sich das System bereits eine Uhrzeit besorgt (siehe Ausgabe von timedatectl).
Was passiert, wenn du die Udev-Regel ausführst (d.h. den Stick einsteckst) nachdem du dich angemeldet hast und das System sich zeitlich synchronisiert hat (mit timedatectl vorher prüfen!)? Ändert das etwas?
Code: Alles auswählen
echo `date '+%s' -d 'tomorrow 17:05:00'` > /sys/class/rtc/rtc0/wakealarm
Entscheidend aber ist, dass der USB-Stick beim Start des NAS bereits gesteckt ist. Stecke ich ihn erst nach vollständigen Start arbeitet date richtig, heute also
Code: Alles auswählen
Tue Sep 21 13:31:00 CEST 2021
Auch noch dieser Hinweis, gestern 20.09.21 um 15:11:30 schrieb ich
Dieses falsche Datum zeigt sich im Terminal auch bei später gesteckten StickPrüfe ich die Datenpartitionen auf dem NAS auf mount- und prüf-Vorgänge, so zeigen alle Partitionen ebenfalls das Datum 14.02.2019, allerdings mit unterschiedlichen Uhrzeiten.
Code: Alles auswählen
root@NAS-01:~# tune2fs -l /dev/sda6 | egrep -i "Last"
Last mounted on: /Daten-2
Last mount time: Thu Feb 14 11:12:20 2019
Last write time: Thu Feb 14 11:12:20 2019
Last checked: Thu Feb 14 11:12:17 2019
Gruss H.
Re: Seltsames im Skript angestossen über udev-Regel
Ich würde mal folgendes annehmen.
- die Batterie ist nicht leer
- beim Neustart bzw. im Schlafmodus wird die korrekte Uhrzeit verwendet
- dann wird sie beim Starten irgendwie falsch initialisiert
- jetzt läuft udev durch
- während des Starts wird sie dann wieder korrekt gesetzt
Vielleicht kann man irgendwie die Reihenfolge beim Boot ändern.
Oder wirklich statt "date" einen anderen Befehl verwenden siehe weiter oben.
- die Batterie ist nicht leer
- beim Neustart bzw. im Schlafmodus wird die korrekte Uhrzeit verwendet
- dann wird sie beim Starten irgendwie falsch initialisiert
- jetzt läuft udev durch
- während des Starts wird sie dann wieder korrekt gesetzt
Vielleicht kann man irgendwie die Reihenfolge beim Boot ändern.
Oder wirklich statt "date" einen anderen Befehl verwenden siehe weiter oben.
Re: Seltsames im Skript angestossen über udev-Regel
Aber dann sollte ein einfacher Test das klären können:
* das NAS aufdrehen
* verifizieren, dass auf der konsole das richtige datum mit `date` daherkommt
* dann den stick anstecken der die UDEV rule auslöst
* verifizieren, dass dort nicht der 14.02. ist
Heißt das auch, du hast die udev regel immer mit einem systemstart getestet?
* das NAS aufdrehen
* verifizieren, dass auf der konsole das richtige datum mit `date` daherkommt
* dann den stick anstecken der die UDEV rule auslöst
* verifizieren, dass dort nicht der 14.02. ist
Heißt das auch, du hast die udev regel immer mit einem systemstart getestet?