ubuntuusers.de

sort sortiert Monate falschherum

Status: Gelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

peterries

Anmeldungsdatum:
5. Mai 2009

Beiträge: 455

Wohnort: Hannover

Hi.

Ich bastele gerade ein script für Aufnahmen mit meinem DVB-T Stick, welches anhand der eingestellten Aufnahmen ('at' jobs) herausfindet, welches der nächste Job ist und diesen dann in die /sys/class/rtc/rtc0/wakealarm einstellt, wenn der Rechner runterfährt (/etc/init.d resp. /etc/rc0.d Skriptaufruf).

Das klappt soweit. Allerdings habe ich gerade festgestellt, dass der verwendete sort Befehl mit meinem User die Dateien falsch herum sortiert. Wenn der Rechner runterfährt und root das skript ausführt, dann stimmt die Reihenfolge der Sortierung. Hat mich graue Haare gekostet beim Testen.

Ich möchte es aber einheitlich haben, deswegen die Frage, warum mein User die Daten (Monate) verkehrtrum sortiert.

Hier das Skript:

#!/bin/sh

# init
#
NEXTAT=0
TIMER=0
DATENOW=`date`

# Datum aus at queue lesen
atq | grep " a " | cut -b 8-27 > /tmp/atqdates

echo $DATENOW >> /home/peter/.timerliste
echo aktuelle Timerliste: >> /home/peter/.timerliste
atq >> /home/peter/.timerliste
echo aufbereitete Timerliste: >> /home/peter/.timerliste
cat /tmp/atqdates >> /home/peter/.timerliste
echo sortierte Timerliste: >> /home/peter/.timerliste

### -- zu debugzwecken doppelt drin / hier passiert der Unterschied.
### -- als angemeldeter User, muß ich hier "... -k 1Mr ..." reverse schreiben, damit es stimmt!
sort -k 4n -k 1M -k 2n -k 3n /tmp/atqdates >> /home/peter/.timerliste
###

# das früheste Datum holen
NEXT=`sort -k 4n -k 1M -k 2n -k 3n /tmp/atqdates | grep : --max-count=1`

echo gefunden für Timer: >> /home/peter/.timerliste
echo $NEXT >> /home/peter/.timerliste

# Datum in Sekundenformat wandeln
if [ -n "$NEXT" ]
then
    NEXTAT=`date +%s --date="$NEXT"`
fi

# neuen Timer 2 Minuten früher erstellen, wenn at queue Eintrag gefunden wurde, sonst löschen
# /sys/class/rtc/rtc0/wakealarm mit "chmod 666" für alle schreibbar machen in /etc/rc.local
if [ $NEXTAT -gt 0 ]
then
    TIMER=$(($NEXTAT-120))
    echo Neuer Timer: $TIMER >> /home/peter/.timerliste
    `echo $TIMER > /sys/class/rtc/rtc0/wakealarm`
else
    # Kein Timer! Wakealarm löschen
    echo Kein Timer! >> /home/peter/.timerliste
    `echo 0 > /sys/class/rtc/rtc0/wakealarm`
fi

# aufräumen
rm /tmp/atqdates
exit 0

Der Output lieferte beim manuellen Aufruf (falsch) und anschliessendem 'shutdown -h now' (richtig) Folgendes:

Mi 28. Apr 10:55:33 CEST 2010
aktuelle Timerliste:
59      Tue May  4 21:10:00 2010 a peter
58      Mon May  3 21:05:00 2010 a peter
57      Wed Apr 28 21:10:00 2010 a peter
aufbereitete Timerliste:
May  4 21:10:00 2010
May  3 21:05:00 2010
Apr 28 21:10:00 2010
sortierte Timerliste:
May  3 21:05:00 2010
May  4 21:10:00 2010
Apr 28 21:10:00 2010   <<< der müßte es sein!
gefunden für Timer:
May 3 21:05:00 2010
Neuer Timer: 1272913380

------------------------------------

Wed Apr 28 10:55:39 CEST 2010
aktuelle Timerliste:
59      Tue May  4 21:10:00 2010 a peter
58      Mon May  3 21:05:00 2010 a peter
57      Wed Apr 28 21:10:00 2010 a peter
aufbereitete Timerliste:
May  4 21:10:00 2010
May  3 21:05:00 2010
Apr 28 21:10:00 2010
sortierte Timerliste:
Apr 28 21:10:00 2010   <<< hier stimmt es!
May  3 21:05:00 2010
May  4 21:10:00 2010
gefunden für Timer:
Apr 28 21:10:00 2010
Neuer Timer: 1272481680

Als Alternative hatte ich mir schon überlegt die von atq ausgegebenen Zeilen gleich in das Sekundenformat zu bringen, da würde ich etwas sparen, nur wie bekomme ich alle Zeilen der /tmp/atqdates Zeilenweise durch den Befehl 'date --date="...hier atq Zeile..." +%s gejagt und in eine Datei rausgeschrieben? 'sed' kann das nicht, oder?

Danke für Tipps!!! Gruß Peter

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Moin,

ich versuche mal, das auf die Essenz herunterzubrechen. Du hast die Datei folgenden Inhalts:

May  4 21:10:00 2010
May  3 21:05:00 2010
Apr 28 21:10:00 2010

Das willst du sortieren. Im Shutdown-Skript erhältst du:

Apr 28 21:10:00 2010
May  3 21:05:00 2010
May  4 21:10:00 2010

Aber normal am Terminal:

May  3 21:05:00 2010
May  4 21:10:00 2010
Apr 28 21:10:00 2010

Hab ich das bis hierhin richtig verstanden? ☺

Dann wäre meine Idee, dass du in deiner normalen Session als Benutzer eine andere Locale aktiv hast als im Shutdown-Skript. Vorallem wird wahrscheinlich als normaler User soetwas erscheinen:

$ locale
LANG=de_DE.utf8
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE="de_DE.utf8"
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=

Im Shutdown-Skript ist aber vermutlich gar nichts explizit gesetzt, weswegen er auf den englischen Standard zurückfällt. Ich hab mir jetzt den Quellcode von sort nicht angeschaut, aber ich vermute mal, dass der auf die Locale zurückgreift. Deswegen kriegst du unterschiedliche Ergebnisse. Schätzungsweise ist das im Deutschen auch nicht "andersrum", sondern er erkennt die Datümer schlichtweg nicht als solche.

Du könntest das im Terminal mal so probieren:

unset LANG
sort ... bla.dat

Oder kürzer (hier wird $LANG nur für den sort-Aufruf vorübergehend auf den leeren String gesetzt):

LANG= sort ... bla.dat

Wenn er dann richtig sortiert, hast du den Übeltäter – locale – gefunden. 😉

peterries

(Themenstarter)

Anmeldungsdatum:
5. Mai 2009

Beiträge: 455

Wohnort: Hannover

Das klingt plausibel. Werde ich probieren. Danke schonmal!

peterries

(Themenstarter)

Anmeldungsdatum:
5. Mai 2009

Beiträge: 455

Wohnort: Hannover

Danke, das war's wirklich. Ich habe zum Test den Datumsstempel im Logfile mal VOR dem Zürucksetzen der LANG Variable gemacht. Da sieht man es nochmal sehr schön, wie das Datum gesetzt ist. Erster Eintrag mit meinem User, zweiter beim Shutdown von root

------------------------
Mi 28. Apr 12:40:17 CEST 2010
aktuelle Timerliste
59      Tue May  4 21:10:00 2010 a peter
58      Mon May  3 21:05:00 2010 a peter
57      Wed Apr 28 21:10:00 2010 a peter
Neuer Timer (Datum) : Apr 28 21:10:00 2010
Neuer Timer (Sek. ) : 1272481500

------------------------
Wed Apr 28 12:40:23 CEST 2010
aktuelle Timerliste
59      Tue May  4 21:10:00 2010 a peter
58      Mon May  3 21:05:00 2010 a peter
57      Wed Apr 28 21:10:00 2010 a peter
Neuer Timer (Datum) : Apr 28 21:10:00 2010
Neuer Timer (Sek. ) : 1272481500

Jetzt ist alles schön. Jetzt muß ich nur noch herausfinden, warum der DVB-T Stick beim booten manchmal nicht erkannt wird und ab-/angestöpselt werden muß...

Danke nochmal!

Antworten |