Datum bei Log-Eintrag

F

firedraggon

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
 
Code:
echo dateiname-$(date +"%d-%m-%Y") > datei
zum Bleistift

Aber man müsste dein script schon zu gesicht bekommen.
 
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
 
Zuletzt bearbeitet:
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
 
@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.
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.
 
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
 
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).
 
Hallo,

...

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).

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
 
Zuletzt bearbeitet von einem Moderator:
...
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

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
 
Zuletzt bearbeitet:
@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
 
Zuletzt bearbeitet von einem Moderator:
Kann das sein, das mein System (AIX 5.3 mit K-Shell) stat nicht kennt? -

MFG
AS

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
 
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
 
@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

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
 
Code:
SIZE=$(wc -c $FILE 2>/dev/null| cut -d " " -f1);

Ich glaube hier liegt momentan sein größtes Problem darin, daß er die Größe nicht in einen sauberen Wert bekommt.
Sein wc scheint blanks vor der Ausgabe zu produzieren:
Code:
> wc -c Tivoli_err.out | cut -f1
    2324 Tivoli_err.out
Wodurch das Ausschneiden mit cut und einem blank-delimiter etwas kompliziert wird.

Falls Du auf Deinem AIX awk (denke mal, das sollte es auch dort geben ;-P) hast, versuch's mal mit:
Code:
SIZE=$(wc -c $FILE 2>/dev/null| awk '{print $1}');
in Wolfang's code.

Gruß Daniel
 
Hallo
Wenn das so ist, kann man alternativ auch tr verwenden.
AWK sollte auch gehen.
Mit
tr -s " "
werden alle doppelten Leerzeichen gelöscht, nur ein leerzeichen verbleibt.
Dann wird das Feld zum zweiten.
Sollten es Tabs sein, dann einfach cut -d"\t" -f2
Code:
# Leerzeichen
SIZE=$(wc -c $FILE 2>/dev/null|tr -s " "|cut -d " " -f2);
# Tab
SIZE=$(wc -c $FILE 2>/dev/null|cut -d "\t " -f2);

Gruß Wolfgang
 
Ach Schande,
also so langsam ist es mir ja peinlich das ich es nicht gerafft krieg, doch das klappt nicht.
@Wolfgang Ich habe nun den Hauptbefehl mal herausgenommen und ausprobiert, doch ich bekomme keine Ausgabe, das sieht so aus:

Code:
wc -c Tivoli_err.out 2>/dev/null| cut -d " " -f1
Sobald ich den zweiten Teil weglass, bekomm ich wieder meine Ausgabe:
Code:
> wc -c Tivoli_err.out                              
    2324 Tivoli_err.out
Es funktioniert weder direkt auf der Konsole, noch im Skript. ?(

MFG
Tobias

P.S. Ich wusste nicht genau, wo die Info mit meinem System hinsoll, deshalb habe ich diese im ersten Beitrag als P.S. gepostet, das sie vielleicht doch auffällt, aber anscheinend nicht. In dem Zitat von dir, steht nur die Wiederholung von mir, trotzdem danke für den Hinweis.

Edit 12:43 Uhr:
Hab eure beiden Antworten erst jetzt gesehen, werd ich gleich ausrobieren.
 
Zuletzt bearbeitet von einem Moderator:
P.S. Ich wusste nicht genau, wo die Info mit meinem System hinsoll, deshalb habe ich diese im ersten Beitrag als P.S. gepostet, das sie vielleicht doch auffällt, aber anscheinend nicht. In dem Zitat von dir, steht nur die Wiederholung von mir, trotzdem danke für den Hinweis.
Hallo
Also dann sorry, ich nehme meinen Hinweis zurück.
Stimmt den PS habe ich nicht gelesen.
Ist eventuell doch gut, sowas am Anfang zu schreiben, was mein Überlesen aber nicht entschuldigen soll.

Hoffe du bekommst das nun gebacken.
Eventuell kannst du im cut auch mal mit den -fX testen.

Gruß Wolfgang
 
Jop, ganz klar - wie bereits erkannt - das Problem sind die Leerzeichen
am Anfang bei der Ausgabe von wc. Ich bin zuversichtlich, dass Dir der Tipp
von Wolfgang:
Code:
SIZE=$(wc -c $FILE 2>/dev/null|tr -s " "|cut -d " " -f2);
bzw. der von Fallout:
Code:
SIZE=$(wc -c $FILE 2>/dev/null| awk '{print $1}');
weiterhilft.


Was meintest du übrigens mit umbrechen?
Ich meine das Rotieren von Logdateien z.B. mit Logrotate
 

Ähnliche Themen

Server-Monitoring mit RRDTool

RedHat 4 (Lineox 4) in VMware mit BusLogic Treiber

Zurück
Oben