ubuntuusers.de

Bashscript spinnt

Status: Gelöst | Ubuntu-Version: Ubuntu 6.06 (Dapper Drake)
Antworten |

pepre Team-Icon

Supporter
Avatar von pepre

Anmeldungsdatum:
31. Oktober 2005

Beiträge: 6474

Wohnort: Erlangen

Hallo,

ist ezz zwar nicht Ubuntu-spezifisch, vllt kann aber trotzdem jemand helfen. "neli" zeigt den Unterschied des Inhaltes der Directories an (neue Files werden aufgelistet).

neli()  # new-list
{
        DIR=/home/ftp/public
        NEW=$DIR/neu.txt
        MDL=$DIR/.media-list
        LST=$MDL/$(date -I).list

        if [ ! -d $MDL ] ; then mkdir $MDL ; fi
        cd $DIR/musik ; ls -1 > $LST   # erstelle neue Liste
        cd $DIR/film ; ls -1 >> $LST   # dto

        cd $MDL
        TMP=$(ls -1 | head -n 1)   # filname älteste Liste
        diff -a $TMP $LST | grep "^>" | tr -d "^> " > $NEW
        find . -ctime +7 -exec rm {} \;   # lösche alle Listen älter als eine Woche
        chown root:nogroup $NEW
} 

Das "diff" erzeugt, wenn es als cronjob läuft, eine Menge flascher Ausgaben - aber auch nicht immer. Rufe ich es direkt aus der bash auf, funktioniert alles wunderbar. Vor "neli" läuft noch eine Sortier- und Format-Routine drüber, aber die wird grosszügig mit "&& sleep 60" abgeschlossen; an Inkonsistenzen des FS kann es also nicht liegen. Welchen peinlichen Fehler mache ich in dem Script?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

Bei der Zuweisung an TMP ist das ls -l verdächtig. Sicher das Du das nicht ohne die Option machen willst!?

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

Marc 'BlackJack' Rintsch hat geschrieben:

Bei der Zuweisung an TMP ist das ls -l verdächtig. Sicher das Du das nicht ohne die Option machen willst!?

Das ist ein "-1", denke ich. Um nur eine Datei pro Zeile aufzulisten.

Gruß
Fredo

pepre Team-Icon

Supporter
(Themenstarter)
Avatar von pepre

Anmeldungsdatum:
31. Oktober 2005

Beiträge: 6474

Wohnort: Erlangen

Jo, ist ein "-1 (minus eins)". Das "-R" kommt später 😉

nudeldieb

Anmeldungsdatum:
3. Juli 2005

Beiträge: 936

Tach,
also: das

TMP=$(ls -1 | head -n 1)   # filname älteste Liste


listet dir nicht die älteste Liste, sondern das alphanumerische erste File im Directory.

Wie wird LST gefüllt?

-ctime
sollte man nicht verwenden, um einen geänderten Inhalt eines Files zu überprüfen.
Aus der info-page zu find:
Each file has three time stamps, which record the last time that
certain operations were performed on the file:

  1. access (read the file's contents)

2. change the status (modify the file or its attributes)

3. modify (change the file's contents)

Gruß,
Andi

pepre Team-Icon

Supporter
(Themenstarter)
Avatar von pepre

Anmeldungsdatum:
31. Oktober 2005

Beiträge: 6474

Wohnort: Erlangen

listet dir nicht die älteste Liste, sondern das alphanumerische erste File im Directory

Das ist auch so gedacht und stimmt, da der filename ja mit "date -I" erstellt wird.

Wie wird LST gefüllt?

Hum? Steht doch im Script: "ls -1 > $LST"

-ctime

Passt auch, da das File erstellt wird, und bis zum Löschen nie mehr geändert wird.

Das Script läuft ja, nur "diff" murkst. Und ich versteh nicht warum.

nudeldieb

Anmeldungsdatum:
3. Juli 2005

Beiträge: 936

Hum? Steht doch im Script: "ls -1 > $LST"


Hoppla, ich werde langsam alt, glaube ich... 😉

Läuft das Skript jeden Tag oder einmal die Woche wegen des ctime +7?

Gruß,
Andi

pepre Team-Icon

Supporter
(Themenstarter)
Avatar von pepre

Anmeldungsdatum:
31. Oktober 2005

Beiträge: 6474

Wohnort: Erlangen

Einmal am Tag um 5:20; also zu einer Uhrzeit, zu der kein Schwein neue Files rein schiebt 😉

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

pepre hat geschrieben:

Das "diff" erzeugt, wenn es als cronjob läuft, eine Menge flascher Ausgaben - aber auch nicht immer. Rufe ich es direkt aus der bash auf, funktioniert alles wunderbar.

Setzt Du vorher die Pfade zu diff, grep und tr?
Wenn es nur als cronjob nicht läuft, dann würde ich da anfangen zu suchen - aber dann dürfte es eigentlich nie laufen.
Wie sehen denn die falschen Ausgaben aus, und wie sähen richtige Ausgaben aus?

Das mit dem 'sleep 60' klingt nach Schlangenöl.
Wie sieht der cronjob aus?

pepre Team-Icon

Supporter
(Themenstarter)
Avatar von pepre

Anmeldungsdatum:
31. Oktober 2005

Beiträge: 6474

Wohnort: Erlangen

Setzt Du vorher die Pfade zu diff, grep und tr?

Nein, geht auch so.

Wie sehen denn die falschen Ausgaben aus?

Ein diff auf die per cron erstellten Listen ergibt als Murks-Eintrag zB

8668d8676
< stoiber_-_gludernde_lot.mp3
8669a8678
> stoiber_-_gludernde_lot.mp3

Es werden zuviele Einträge als "neu" gelistet; sprich: Zeilen erscheinen, die in den zu vergleichenden Listen identisch sind. Und 'man diff' schweigt sich geflissentlich zu den ausgegebenen (differierenden) Zahlen aus; da muss ich wohl mal tiefergehend recherchieren.

Wie sieht der cronjob aus?

20      5       *       *       *       root    /usr/local/bin/bullshit > /dev/null 2>&1

wobei 'bullshit' diverse Aufgaben erledigt, unter anderem eben auch die Funktion 'neli'.

nudeldieb

Anmeldungsdatum:
3. Juli 2005

Beiträge: 936

Hmmm,
ich würde jetzt nochmal ein diff -b ausprobieren. Ansonsten hilft hier vll ein comm -3 auf die beiden Files. Allerdings müssen sie dafür sortiert sein.
HTH.

Gruß,
Andi

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

pepre hat geschrieben:

Ein diff auf die per cron erstellten Listen ergibt als Murks-Eintrag zB

8668d8676
< stoiber_-_gludernde_lot.mp3
8669a8678
stoiber_-_gludernde_lot.mp3

Es werden zuviele Einträge als "neu" gelistet; sprich: Zeilen erscheinen, die in den zu vergleichenden Listen identisch sind. Und 'man diff' schweigt sich geflissentlich zu den ausgegebenen (differierenden) Zahlen aus; da muss ich wohl mal tiefergehend recherchieren.

Sind die Zeilen wirklich 100% identisch? Keine Leerzeichen, Tabs oder Wagenrücklaufzeichen am Ende die man nicht sieht?

Und was genau "schützt" Du mit dem sleep? Bist Du wirklich 100%ig sicher, dass da nicht noch andere Prozesse an den Daten basteln wenn die Funktion läuft?

Mal ins Blaue geraten: Stimmen die Zahlen vor und nach dem 'a' ungefähr mit der Zeilennummer in der Textdatei überein?

pepre Team-Icon

Supporter
(Themenstarter)
Avatar von pepre

Anmeldungsdatum:
31. Oktober 2005

Beiträge: 6474

Wohnort: Erlangen

diff -b ; comm -3

"-b" schon probiert, kein Unterschied. Mit "comm" liesse sich ein Workaround realisieren, aber eigentlich will ich die Ursache für das Verhalten ergründen ☺

Sind die Zeilen wirklich 100% identisch? Keine Leerzeichen, Tabs oder Wagenrücklaufzeichen am Ende die man nicht sieht?

Sie sind - bis auf die fehlenden Zeilen - komplett identisch, sie werden ja vom gleichen Script erzeugt. Ok, ich werds mir nochmal als Hex genau ansehen.

Und was genau "schützt" Du mit dem sleep?

Die Partition mit den Files liegt auf einem LV in einem RAID5/LVM/loopAES-FS. Sicherheitshalber hab ich das "sleep" eingebaut, da dieses Konstrukt manchmal etwas zäh reagiert.

Bist Du wirklich 100%ig sicher, dass da nicht noch andere Prozesse an den Daten basteln wenn die Funktion läuft?

100%ig.

Stimmen die Zahlen vor und nach dem 'a' ungefähr mit der Zeilennummer in der Textdatei überein?

Ja, tun sie, das wusste ich schon. Leider hat mir diese Erkenntnis bisher nicht wirklich weitergeholfen. Muss mich wohl tiefer mit "diff" beschäftigen.

pepre Team-Icon

Supporter
(Themenstarter)
Avatar von pepre

Anmeldungsdatum:
31. Oktober 2005

Beiträge: 6474

Wohnort: Erlangen

ls -1 | sort > $LST

Aus unerfindlichen Gründen muss die Ausgabe von "ls" noch durch "sort" gepiped werden, dann funktioniert es.

Antworten |