Datum bei Log-Eintrag

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von firedraggon, 18.04.2007.

  1. #1 firedraggon, 18.04.2007
    firedraggon

    firedraggon Guest

    Hallo,
    jetzt lacht bitte nicht, ich denk es ist recht einfach, nur ich krieg´s nicht hin.
    Vielleicht könnte mir jemand weiterhelfen?

    Ich möchte, das mein Skript seine Standardausgabe in dateia und seine Fehlerausgabe in Dateib schreibt, mit jeweils dem aktuellen Datum.

    Habe es beim Skriptaufruf versucht:

    Code:
    Script.sh date >dateia.out date 2>dateib.out
    Hat nicht funktioniert.


    Als nächter Skriptaufruf:

    Code:
    Script.sh > date dateia.out 2> date dateib.out
    Hat natürlich schon zweimal nicht funktioniert. Hatte meine Ausgaben dann jeweils in der Datei "date", jedoch immer noch ohne Datum :-( .


    Meiner nächster Versuch, war dann den Skript selbst anzupassen:

    Code:
    #Datum=$(date)
    einer Variablendefinition innerhalb des Skriptes von dem Wert "date", und dann die Ausgabe mit:
    Code:
    echo $Datum "Abgefragter Dienst war bereits aktiv und wurde beendet";
    Hier bekam ich jedoch immer das gleiche Datum (auf die Sekunde genau) angezeigt, also nicht fortlaufend.

    Und einfach nur mit:

    Code:
    echo date "Abgefragter Dienst war bereits aktiv und wurde beendet";
    hat auch nicht funktioniert. Bekam ich dann halt den Wert "date" als "date auch wieder ausgegeben, was ja auch verständlich war.

    Würde mich freuen wenn jemand einen Tipp hat.

    MFG
    fire

    P.S. System ist AIX 5.3; Shell: K-Shell
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. buli

    buli Debianator

    Dabei seit:
    16.09.2006
    Beiträge:
    789
    Zustimmungen:
    0
    Ort:
    Essen/Ruhrgebiet
    Code:
    echo dateiname-$(date +"%d-%m-%Y") > datei
    zum Bleistift

    Aber man müsste dein script schon zu gesicht bekommen.
     
  4. #3 Wolfgang, 18.04.2007
    Zuletzt bearbeitet: 18.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Wenn du in längeren Programmzyklen die aktuelle Zeit aka Datum willst, musst du dies natürlich on the fly erzeugen.
    Wenn du vorher eine Variable setzt, ist die natürlich immer gleich.

    Also musst du sie quasi vor Ort initialisieren, oder direckt mit echo ausgeben.
    Code:
    ...
    #EROOR ist hier ein Synonym für einen Fehlerfall
    if (ERROR) then
    ERRORDATE=$(date )
    echo $ERRORDATE
    ...
    #oder direkt 
    echo $(date);
    
    Noch ein Tipp:
    Bei Redirect wird immer von Links nach Rechts verarbeitet.

    Gruß Wolfgang
     
  5. #4 firedraggon, 18.04.2007
    firedraggon

    firedraggon Guest

    Hi buli und Wolfgang,

    danke für eure Antwort. Ich habe die letzte Lösung genommen, und bei jedem echo, was er mir ausgibt nun ein $(date) mit rein genommen und es funktioniert. *g*

    @buli Deine Lösung hab ich jedoch nicht verstanden, würde das bedeuten, das ich sobald ich den Skript ausführe, hier schon in der Ausführungszeile schon global sagen kann, setze jedem Log-Eintrag ein Datum davor?
    Das wäre natürlich noch besser.

    @Wolfgang Was bedeutet "Redireck"?

    MFG
    fire
     
  6. #5 Wolfgang, 18.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Wieder einer meiner Fipptehler.

    Ich meinte Redirect.
    Das bedeutet Umleiten
    Z.B.
    echo "text" >datei

    Leitet die <STDOUT> nach datei um.

    Gruß Wolfgang
     
  7. buli

    buli Debianator

    Dabei seit:
    16.09.2006
    Beiträge:
    789
    Zustimmungen:
    0
    Ort:
    Essen/Ruhrgebiet
    Nein.
    Das war nur ein Beispiel, wie du das Datum in die Date "redirecten" kannst ;)

    So, wie ich dein Vorhaben verstehe, musst du ne Variable setzen:
    Code:
    datum=$(date +"%d-%m-%Y")
    Dann im script:
    Code:
    echo $?-$datum > logdatei
    Das ? ist für die Fehlerausgabe.

    Ich bin kein Meister im scripten, aber so würde ich das machen.
     
  8. #7 firedraggon, 18.04.2007
    firedraggon

    firedraggon Guest

    Danke für die Infos.

    Ich rufe meinen Skript nun so auf:

    Code:
    Tivoli_Endpoint.sh >>Tivoli.out 2>>Tivoli_err.out
    und er lautet folgendermaßen:

    Code:
    #Skript startet und stoppt den lcfd Dienst
    
    #Skript startet und wartet eine zufällige Zeit ab, bis eigentliche Ausführung beginnt
    #da der Dienst unter root-Rechten läuft und niemand darüber informiert sein soll,
    #wann dies der Fall ist.
    
    PATH=/usr/bin:/opt/Tivoli/lcf/dat/1;
    MYID=$(ps ax|grep "lcfd"| grep -v grep | awk {'print $1'});
    
    #sleep $RANDOM;
    echo $(date) Skriptausführung beginnt nun;
    
    if ./Tivoli_err.out => 1000
    then
    echo "" >./Tivoli_err.out
    fi
    
    if ./Tivoli.out >= 1000
    then
    echo "" >./Tivoli.out
    fi
    
    if [ -n $MYID ];
    
    then
    kill $MYID;
    echo $(date) "lcfd-Dienst war bereits aktiv und wurde beendet";
    echo $(date) "Skript wurde beendet";
    
    else
    echo $(date) "lcfd-Diest läuft nicht und wird gestartet";
    /opt/Tivoli/lcf/dat/1/lcfd.sh
    
    #prüfen ob der Start geklappt hat usw.
    MYID=$(ps ax|grep "lcfd"| grep -v grep | awk {'print $1'});
    echo $(date) "lcfd-Dienst wurde mit ID $MYID gestartet";
    
    #Dienst läuft und Programm wird nach 10 Minuten beendet
    sleep 600;
    kill $MYID;
    echo $(date) "lcfd-Dienst wurde wieder beendet";
    echo $(date) "Skript wurde wieder beendet";
    fi
    Jetzt habe ich mir gedacht, das es evtl. sinnvoll ist, die Ausgaben an die bereits vorhandenen anzuhängen. Hier wäre es jedoch sinnvoll eine Abfrage einzubauen, (siehe oben), welche überprüft, wie voll die Dateien sind und diese dann leert, denn nur so kann ein vollaufen (was zwar nicht so schnell passieren würde, aber doch irgendwann) verhindert werden.
    Dazu fehlt mir jedoch der passende Operator, ich habe mir überlegt, dies nach dem Motto zu machen " Wenn Datei größer als 1000 byte ist, dann löschen", doch es funktioniert nicht, da ich vermutlich nicht den richtigen Operator habe.
    Wisst ihr evtl. einen Weg, was für ein Zeichen man hier benötigt?

    Auch habe ich gesehen, dass die vom System erzeugten Meldungen keine Zeitangabe haben, gibt es hier evtl. eine Möglichkeit hier auch eine zu vergeben. Ich habe es vorhin schonmal im Aufruf versucht, doch da hat es nicht funktioniert.

    Nochmal danke für eure Hilfe.

    MFG
    fire
     
  9. #8 Schlaubi_fi.de, 19.04.2007
    Schlaubi_fi.de

    Schlaubi_fi.de Mac OS X User

    Dabei seit:
    22.12.2004
    Beiträge:
    304
    Zustimmungen:
    0
    Hallo,

    Quick'n'Dirty, ohne Abprüfung, ob die Datei vorhanden ist, etc...

    Code:
    if test "$(du ./Tivoli.out|cut -f1)" -gt 1000
    then
    echo "" >./Tivoli.out
    fi
    
    Im Übrigen würde ich mal drüber nachdenken, ob Du das Logfile nicht
    so groß lässt und es mit Hilfe eines Cronjobs nächtlich bzw. regelmäßig
    rotierst (umbrichst).
     
  10. #9 Wolfgang, 19.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Es gibt auch wc -c.

    ;)
    Gruß Wolfgang
     
  11. #10 firedraggon, 19.04.2007
    Zuletzt von einem Moderator bearbeitet: 19.04.2007
    firedraggon

    firedraggon Guest

    Hallo Schlaubi,
    danke für deinen Kommentar.
    Ich hab den Code mal kopiert und bei mir war es dann so, dass ich nach dem Command:
    Code:
    du ./Tivoli.out|cut -f1
    als Ergebnis 16 bekommen habe. Obwohl meine Datei über 4000 byte groß war. Was läuft da falsch? - Ich hab mir dann natürlich die Man-Page angeschaut, doch hier habe nix richtiges gefunden. Ich habe dann den Wert von "-gt 1000" auf "-gt 14" gesetzt und dann hat es funktioniert. Jedoch weiß ich nicht, warum der Code auf 16 gekommen ist und nicht auf 4000.

    Was meintest du übrigens mit umbrechen?

    ---

    @Wolfgang
    Werde deine Idee gleich mal anschau´n, kam noch nicht dazu.

    MFG
    fire
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Hallo,

    so, jetzt hab ich versucht die beiden Befehle zu kombinieren, doch es funktioniert nicht.
    Also meine Vorstellung ist, das "test", das Ergebnis der Klammer nimmt und schaut, ob dies größer ist als Tausend und dann "then" ausgefüht wird, doch auch wenn meine Datei kleiner als 1000 ist, wird der Dateiinhalt gelöscht.
    Ich habe den Vorschlag von Schlaubi und Wolfgang so abgeändert, das ich als Testergebnis auch meine tatsächliche Dateigröße habe und diese mit cut nochmal auf genau diese 4 Stellen beschnitten wird. (Ansonsten habe ich ja auch den Dateinamen mit drin.)
    Seht ihr da evtl. einen Fehler?

    Code:
    if test "$(wc -c Tivoli_err.out|cut -c 4-8)" -gt 1000
    then
    echo "" >./Tivoli.out
    fi
    Danke für´s drüberschau´n.
    MFG
    fire
     
  12. #11 Fallout, 19.04.2007
    Zuletzt bearbeitet: 19.04.2007
    Fallout

    Fallout Doppel-As

    Dabei seit:
    02.03.2007
    Beiträge:
    120
    Zustimmungen:
    0
    Hi,

    ggf. ist eine Alternative mit `stat` hilfreich, um die Dateigröße zu überprüfen:

    Code:
    # Wenn Tivoli_err.out groesser als 1000 Byte ist
    if [ $(stat -c "%s" Tivoli_err.out) -gt 1000 ]; then
     # archiviere die Datei im Format "Tivoli_err_YYYYMMDD_HHMMSS.out"
     mv Tivoli_err.out Tivoli_err_$(date "+%Y%m%d_%H%M%S").out
     # Edit: Um Folgefehler zu verhindern, weil die Datei nicht mehr da ist, und nicht angelegt wurde, bevor das Skript erneut aufgerufen wird:
     touch Tivoli_err.out
    fi
    Gruß Daniel
     
  13. #12 firedraggon, 19.04.2007
    Zuletzt von einem Moderator bearbeitet: 19.04.2007
    firedraggon

    firedraggon Guest

    @Fallout
    Danke für deinen Beitrag.

    Hab den Code zum Testen mal genau so übernommen, um ihn dann danach anzupassen, doch hier bekomm ich gleich schon zwei Fehlermeldungen:

    Code:
    neu_neu[2]: stat:  not found.
    neu_neu[2]: test: 0403-004 Specify a parameter with this command.
    
    Kann das sein, das mein System (AIX 5.3 mit K-Shell) stat nicht kennt? -

    MFG
    Tobias
     
  14. #13 Fallout, 19.04.2007
    Fallout

    Fallout Doppel-As

    Dabei seit:
    02.03.2007
    Beiträge:
    120
    Zustimmungen:
    0
    Sieht ganz so aus. Ich hab hier leider AIX zum Testen/Vergleichen - ggf. kann man das Paket nachinstallieren, dann ist das Skript aber natürlich nicht all zu gebräuchlich für Portierungen auf andere Standard-AIX Systeme.

    Dann solltest Du ggf. doch auf bereits erwähnte Boardwerkzeuge zurückgreifen, wie:
    Code:
    wc -c Tivoli_err.out | cut -f1
    # oder
    du -b Tivoli_err.out | cut -f1
    Gruß Daniel
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 firedraggon, 19.04.2007
    firedraggon

    firedraggon Guest

    Hi,

    der eine Befehl
    wc -c Tivoli_err.out | cut -f1
    wurde ja schon weiter oben gepostet, doch bei mir sieht die Ausgabe so aus:

    Code:
    > wc -c Tivoli_err.out | cut -f1
        2324 Tivoli_err.out
    
    Aus diesem Grund habe ich versucht, nur die byte-Zahl zu erhalten mit
    wc -c Tivoli_err.out|cut -c 4-8 .
    Was ja bei der Konsoleneingabe auch funktioniert, nur wenn ich es im Skript verwende:
    Code:
    if test "$(wc -c Tivoli_err.out|cut -c 4-8)" -gt 1000
    then
    echo "" >./Tivoli.out
    fi
    wird die Datei "Tivoli_err.out" auch überschrieben wenn diese noch keine 1000 byte erreicht hat.

    Die Alternative:
    du -b Tivoli_err.out | cut -f1
    kennt er bei mir nicht. Meine Ausgabe lautet dann immer:
    Code:
    > du -b Tivoli_err.out | cut -f1
    du: Not a recognized flag: b
    Usage: du [-a | -s] [-rlkmgx] [ -H | -L ] [Name ...]
    
    Noch ne Idee *unglücklichguck*?
    MFG
    Tobias
     
  17. #15 Wolfgang, 19.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Das alte Problem.
    Dann möchte ich dich doch noch einmal an dieses Topic erinnern.
    :oldman
    Schließlich steht das nicht umsonst dort. ;)

    Wenn dein System wc mit gleichen Optionen kennt, sollte das zuverlässig sein.
    Allerdings würde ich sicherheitshalber eine Variable verwenden und vorher initialisieren.
    Code:
    SIZE=0;
    FILE=Tivoli_err.out;
    if [ -e $FILE ];
    then
    SIZE=$(wc -c $FILE 2>/dev/null| cut -d " " -f1);
    fi;
    
    if  [ $SIZE -gt 4000 ];
    then
    echo ...
    fi
    
    Damit stellst du sicher, dass Der Vergleich immer numerisch ist und die Datei existiert.
    Wenn die Datei nicht existiert, ist die Variable eben 0 und der Vergleich bleibt numerisch.


    Gruß Wolfgang
     
Thema:

Datum bei Log-Eintrag

Die Seite wird geladen...

Datum bei Log-Eintrag - Ähnliche Themen

  1. Shell-Skript Datum in einer Datai suchen

    Shell-Skript Datum in einer Datai suchen: Hallo zusammen Ich komm eigentlich aus der Klicki-Bunti-Welt von Windows. Seit geraumer Zeit versuche ich meine Künste mit verschiedenen...
  2. Wie kann ich im AIX x Tage vom Datum subtrahieren ?

    Wie kann ich im AIX x Tage vom Datum subtrahieren ?: Für ein Skript unter AIX brauche ich einen Code, der mir vom aktuellen Datum 7 Tage abzieht und das Datum im gewünschten Format ausgibt. Hat...
  3. Wie filtere ich nach Datum um Files zu löschen

    Wie filtere ich nach Datum um Files zu löschen: Ich möchte alle *.sql Dateien löschen die älter als 20 Tage sind. Die Verbindung mache ich von einem RedHat auf eine Windows 2008 Server....
  4. Dateien nach Datum finden

    Dateien nach Datum finden: Hallo zusammen, ich würde gerne Wissen wie ich am einfachsten Dateien nach einem bestimmten Datum in einem Verzeichnis suchen kann. Das...
  5. Linux Mint & Evolution => Mails nach Datum sortieren

    Linux Mint & Evolution => Mails nach Datum sortieren: Hallo Leutz, ertmal hallo, bin hier neu :D. Bin mit nicht ganz sicher, ob das Theme hier rein passt, wab aber nichts besseres gefunden....