derJosh Geschrieben 21. Oktober 2004 Teilen Geschrieben 21. Oktober 2004 hi ich habe ein shellscript geschrieben, das die debug ausgaben eines progs. in eine log datei packt. problem ist nur, wenn von mehreren rechnern das prog aufgerufen wird, ist das schlecht mit der übersicht im log gibt es eine möglichkeit die logdatei nach dem ersten aufruf zu sperren, so dass nur "einer" reinschreiben kann und andere inputs am besten noch gepuffert, danach reingeschoben werden? ich hoffe mal, dass das geht gruss und thx im vorraus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 21. Oktober 2004 Teilen Geschrieben 21. Oktober 2004 Hi, du kannst afaik keine Datei exklusiv sperren. Aber hier ein Vorschlag für KSH. Am Anfang von deinem Script machst du: set -C until >/tmp/mutex.logdateiX do sleep 1 done 2>/dev/null set +C Und am Ende: rm /tmp/mutex.logdateiX So ist zwar die Log-Datei nicht prinzipiell geschützt, aber immerhin ist sie vor Mehrfachaufruf von diesem Script geschützt. cya alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
derJosh Geschrieben 21. Oktober 2004 Autor Teilen Geschrieben 21. Oktober 2004 ich benutze bash .... und das ganze nochmal umzuschreiben ist ein bissel .... nunja unangenehm ... kannst du dein script vllt trotzdem ein wenig erläutern ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 21. Oktober 2004 Teilen Geschrieben 21. Oktober 2004 Hi, könnte auch mit bash gehen, kanns nur nicht test, da ich keine zur Hand hab. set -C: -C Prevent existing files from being overwritten by the shell's > redirection operator. The >| redirection operator will override this noclobber option for an individual file. until >/tmp/DATEI: versucht /tmp/DATEI anzulegen, was nur möglich, wenn sie noch nicht existiert, ansonsten do sleep 1: done 2>/dev/null wartet er eine Sekunde und versucht es wieder bis er die Datei anlegen kann. set +C: Dekativiert die Funktion wieder (das musst du nur machen, wenn du in deinem Script noch irgendwelche Dateien mit ">" überschreiben willlst) rm /tmp/DATEI: löscht diese "Sperrdatei" und so kann das wiederholt aufgerufene Script sie wieder anlagen und hüpft somit aus der Schleife. Verstanden? cya alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 21. Oktober 2004 Teilen Geschrieben 21. Oktober 2004 problem ist nur, wenn von mehreren rechnern das prog aufgerufen wird, ist das schlecht mit der übersicht im log gibt es eine möglichkeit die logdatei nach dem ersten aufruf zu sperren, so dass nur "einer" reinschreiben kann und andere inputs am besten noch gepuffert, danach reingeschoben werden? Eigentlich würde ich den Weg gehen den auch syslog geht, log den Rechner und die PID einfach mit. Für die Übersicht im Logfile hat der liebe (Unix-)Gott grep Erfunden Das ist auf jeden Fall verlässlicher und vermutlich performanter als ein rumhantieren mit N Pufferdateien deren Grösse von 0 bis Unendlich reichen kann. Oder, wenn das Programm wirklich nur einmal pro Maschine läuft, logge gleich nach ${LOGFILE}.${HOSTNAME}. Wenn es sich jedoch nicht umgehen lässt sollte jede Instanz einfach in ein eigenes tempfile loggen (man mktemp). Erst wenn das Programm durchgelaufen ist wird der inhalt ins Logfile kopiert. Vorher kann man dann einfach ein Lockfile in /var/lock setzen, das die anderen Instanzen dann Beachten. LOCKFILE=/var/lock/irgendwas.lck LOGFILE=/var/log/Programm/my.log TMPFILE=`mktemp /tmp/$0.XXXXXX` || exit 1 # ... # Alles da rein schreiben # ... # Programm fertig while [ -f $LOCKFILE ] do sleep 1 done touch $LOCKFILE cat $TMPFILE >> $LOGFILE rm $TMPFILE rm $LOCKFILE exit 0 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 21. Oktober 2004 Teilen Geschrieben 21. Oktober 2004 Hi, ist ja das selbe in grün, nur dass ich erst checken würde, bevor das ganze Script ausgeführt wird, denn wer weiss was in dem Script für Daten verändert werden, die ein laufendes Script evtl. noch benötigt. Ausserdem darfst du nicht vergessen ein trap einzubauen, der das Lock-File bei Bedarf löscht, da sonst erstmal unbemerkt x-mal das Script gestarter würden, aber in der Schleife hängen bleiben... cya alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
derJosh Geschrieben 21. Oktober 2004 Autor Teilen Geschrieben 21. Oktober 2004 danke erstmal ... ich werde mir das morgen mal genauer anschaun, hab atm keine zeit ... noch zur info ... das prog läuft zentral auf einem server und wird auch nur da aufgerufen und der output in EINE logfile geschrieben ... das programm ist ueber webseite aufrufbar und daher auch von mehreren maschinen gleichzeitig .... ... wie gesagt: morgen schau ich mal was so geht, und ich berichte dann thx und gruss .... Josh Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 21. Oktober 2004 Teilen Geschrieben 21. Oktober 2004 Ausserdem darfst du nicht vergessen ein trap einzubauen, der das Lock-File bei Bedarf löscht, da sonst erstmal unbemerkt x-mal das Script gestarter würden, aber in der Schleife hängen bleiben... As I said... viel zu kompliziert. Wenn das Script auf genau einer Maschine läuft, PID und REMOTE_HOST mitloggen und sich gut mit grep anfreunden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
derJosh Geschrieben 22. Oktober 2004 Autor Teilen Geschrieben 22. Oktober 2004 also das mit dem pid/remote host mitloggen ist net ganz so einfach: das eigentliche programm ist ein _sehr_ komplexes perl script, das im debug modus, statusmeldungen raushaut - da kann ich net einfach in den code eingreifen ... ich wüsste garnet wo. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.