[gelöst] 'tail -F /path/to/logfile &' läuft nach scriptende

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

[gelöst] 'tail -F /path/to/logfile &' läuft nach scriptende

Beitrag von MartinV » 11.10.2015 20:32:08

Hallo!

Ich bin auf ein Kuriosum gestoßen, das ich nicht verstehe:
Ich will eine Logdatei "live" anzeigen lassen. Die Logdatei erzeuge ich mit

Code: Alles auswählen

xinit $XINITRC -- $XCOMMAND  > $XINITLOGFILE 2>&1
Das funktioniert soweit.
Noch vor dem Aufruf von xinit starte ich

Code: Alles auswählen

    echo "" >$XINITLOGFILE
    tail -F $XINITLOGFILE &
Beim ersten Aufruf des Scriptes scheint alles so, wie es sein soll. Beispielausgabe:

Code: Alles auswählen

The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning:          Type "ONE_LEVEL" has 1 levels, but <RALT> has 2 symbols
>                   Ignoring extra symbols
Errors from xkbcomp are not fatal to the X server
xfce4-session: Another session manager is already running
xinit: connection to X server lost

waiting for X server to shut down (II) Server terminated successfully (0). Closing log file.
Starte ich das Script erneut, wird alles verdoppelt:

Code: Alles auswählen

The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning:          Type "ONE_LEVEL" has 1 levels, but <RALT> has 2 symbols
>                   Ignoring extra symbols
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning:          Type "ONE_LEVEL" has 1 levels, but <RALT> has 2 symbols
>                   Ignoring extra symbols
Errors from xkbcomp are not fatal to the X server
Errors from xkbcomp are not fatal to the X server
xfce4-session: Another session manager is already running
xfce4-session: Another session manager is already running
xinit: connection to X server lost

waiting for X server to shut down xinit: connection to X server lost

waiting for X server to shut down (II)(II)  Server terminated successfully (0). Closing log file.
Server terminated successfully (0). Closing log file.
Beim nächsten Start wird alles verdreifacht usw.
Der Aufruf von im Terminal zeigt nichts.
Eintragungen von Hand in das Logfile werden auf stdout ausgegeben.
Ein

Code: Alles auswählen

killall tail
beendet den Spuk.

Eigentlich gehe ich davon aus, daß im Script gestartete Prozesse bei Scriptende mit beendet werden. Das ist hier anscheinend nicht der Fall. Kann mir das jemand erklären?

Viele Grüße, Lauscher
Zuletzt geändert von MartinV am 12.10.2015 10:00:51, insgesamt 1-mal geändert.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: 'tail -F /path/to/logfile &' läuft nach scriptende weite

Beitrag von MSfree » 11.10.2015 21:29:07

MartinV hat geschrieben:Eigentlich gehe ich davon aus, daß im Script gestartete Prozesse bei Scriptende mit beendet werden. Das ist hier anscheinend nicht der Fall. Kann mir das jemand erklären?
Dein Denkfehler liegt in dem kleinen "&"-Zeichen, das bewirkt, daß ein Prozeß in den Hintergrund geschickt wird. Das Ende des Skriptes beendet ja nicht die laufende Shell und damit auch nicht den Hintegrundprozeß.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: 'tail -F /path/to/logfile &' läuft nach scriptende weite

Beitrag von MartinV » 12.10.2015 07:41:16

Hallo Msfree,

danke für Deine Antwort!
Was ich aber dann dennoch nicht verstehe: Warum wird tail nicht von angezeigt? Starte ich ein Programm direkt in der Shell (und nicht im Skript), z. B.

Code: Alles auswählen

hitori &
erscheint es in der Liste der Jobs. tail jedoch nicht.

Viele Grüße, Lauscher
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: 'tail -F /path/to/logfile &' läuft nach scriptende weite

Beitrag von MSfree » 12.10.2015 08:06:17

jobs listet meines Wissens nur die unmittelbar aus der Kommandozeile mit & gestarteten Prozesse, nicht aber die, die aus einem Skript gestartet wurden.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: 'tail -F /path/to/logfile &' läuft nach scriptende weite

Beitrag von MartinV » 12.10.2015 09:59:48

ok ...hm. Damit erzeuge ich sozusagen "versteckte" Hintergrundprozesse.
Ich habe das jetzt zum Anlaß genommen, die PIDs aller Hintergrundprozesse im Script aufzufangen und am Scriptende mit 'kill PID' zu beenden.
Wieder was gelernt ...

Danke!
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: 'tail -F /path/to/logfile &' läuft nach scriptende weite

Beitrag von MSfree » 12.10.2015 10:31:14

MartinV hat geschrieben:Ich habe das jetzt zum Anlaß genommen, die PIDs aller Hintergrundprozesse im Script aufzufangen und am Scriptende mit 'kill PID' zu beenden.
Eigentlich erzeugst du doch nur einen Hintergrundprozeß und der läßt sich mit kill %1 aus deinem Skript beenden.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: [gelöst] 'tail -F /path/to/logfile &' läuft nach script

Beitrag von MartinV » 12.10.2015 10:42:31

Ich mache mehrere Aufrufe von tail, für mehrere Logfiles; und in xinitrc gibt es auch noch ein paar Hintergrundprozesse.
Die Hintergrundprozesse in xinitrc wurden vom X server abgeschossen, mit Fehlermeldungen; diese Fehlermeldungen sind jetzt auch vorbei.
Jetzt ist das Script ein paar Zeilen länger, aber dafür sauberer.
Zuletzt geändert von MartinV am 12.10.2015 12:50:02, insgesamt 1-mal geändert.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

uname
Beiträge: 12399
Registriert: 03.06.2008 09:33:02

Re: [gelöst] 'tail -F /path/to/logfile &' läuft nach script

Beitrag von uname » 12.10.2015 11:16:15

Prozesse kann man so zuordnen und killen

Code: Alles auswählen

tail ...&
pid1=$!
tail ...&
pid2=$!
kill $pid1
kill $pid2
wobei man sich fragen kann ob das ganze nicht auch besser zu lösen ist.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: [gelöst] 'tail -F /path/to/logfile &' läuft nach script

Beitrag von MSfree » 12.10.2015 11:17:34

uname hat geschrieben:Prozesse kann man so zuordnen und killen

Code: Alles auswählen

tail ...&
pid1=$!
tail ...&
pid2=$!
kill $pid1
kill $pid2
wobei man sich fragen kann ob das ganze nicht auch besser zu lösen ist.
Das geht mit % sogar noch einfacher:

Code: Alles auswählen

tail ...&
tail ...&
kill %1
kill %2

uname
Beiträge: 12399
Registriert: 03.06.2008 09:33:02

Re: [gelöst] 'tail -F /path/to/logfile &' läuft nach script

Beitrag von uname » 12.10.2015 11:34:05

Das stimmt. Nur leider ist deine Lösung bei vielen Einträgen, neuen Einträgen oder Umsortierungen etwas fehleranfällig. Hat etwas mit schöner Programmierung zu tun. Statt "pid1" und "pid2" könnte man aber auch noch sprechende Bezeichner verwenden.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: [gelöst] 'tail -F /path/to/logfile &' läuft nach script

Beitrag von MartinV » 12.10.2015 12:39:28

Ich habe es jetzt so gelöst:

Code: Alles auswählen

    tail -F $XINITLOGFILE 2> /dev/null &
    JOBSTOKILL="$JOBSTOKILL $!"
    tail -F $XTERMLOGFILE 2> /dev/null &
    JOBSTOKILL="$JOBSTOKILL $!" 
    tail -F $XPRASERVERLOGFILE 2> /dev/null &
    JOBSTOKILL="$JOBSTOKILL $!"
    tail -F $DOCKERLOGFILE 2> /dev/null &
    JOBSTOKILL="$JOBSTOKILL $!"
(Das '2> /dev/null' soll Meldungen von tail unterdrücken)
Am Ende des Scriptes:

Code: Alles auswählen

for ARGUMENT in $JOBSTOKILL ; do kill $ARGUMENT ; done
Analog habe ich ein $XINITJOBSTOKILL, das am Ende von xinitrc abgearbeitet wird.

Edit: Anmerkung: Durch den mehrfachen Aufruf von tail werden alle Logdateien gleichzeitig angezeigt, also Meldungen von verschiedenen Prozessen durcheinander. Das erschwert die Übersicht, macht aber zeitliche Zusammenhänge bei Fehlern deutlicher. Will ich die Meldungen von nur einem Prozeß sehen, schau ich in der jeweiligen Logdatei nach.
Edit2: Gäbe es jetzt noch einen Trick, mit der ich vor jeder Ausgabezeile einen Hinweis auf die Herkunft machen könnte, wäre das natürlich sehr hübsch und würde die Übersicht wesentlich verbessern.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

uname
Beiträge: 12399
Registriert: 03.06.2008 09:33:02

Re: [gelöst] 'tail -F /path/to/logfile &' läuft nach script

Beitrag von uname » 12.10.2015 13:24:43

Keine Ahnung. Aber du könntest dir auch einfach mal Debianmultitail anschauen.
Auch kannst du

Code: Alles auswählen

tail -f a.log b.log c.log &
versuchen.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: [gelöst] 'tail -F /path/to/logfile &' läuft nach script

Beitrag von MartinV » 12.10.2015 14:35:24

uname hat geschrieben: Auch kannst du

Code: Alles auswählen

tail -f a.log b.log c.log &
versuchen.
Das ist eine gute Idee, damit habe ich nur noch einen tail-Prozeß am Laufen UND bekomme eine sortierte Ausgabe!
Die einzelnen "Blöcke" überschreibt tail jetzt mit dem Dateinamen, z. B.

Code: Alles auswählen

==> /home/lauscher/.cache/x11docker/X1/xinit.log <==

The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning:          Type "ONE_LEVEL" has 1 levels, but <RALT> has 2 symbols
>                   Ignoring extra symbols
Errors from xkbcomp are not fatal to the X server
[...]
ObRender-Message: Cannot load image "speedcrunch.xpm" from file "speedcrunch.xpm"

==> /home/lauscher/.cache/x11docker/X1/xterm.log <==
x11docker will start docker on display :1 with command:
su -c docker run -e DISPLAY=172.17.42.1:1 -v /home/lauscher/.cache/x11docker/X1/Xclientcookie:/Xcookie:ro -e XAUTHORITY=/Xcookie --cidfile=/home/lauscher/.cache/x11docker/X1/containerID  lxde-core pcmanfm
Please type in your password:
Passwort: 

==> /home/lauscher/.cache/x11docker/X1/docker.log <==

** (pcmanfm:1): WARNING **: terminal x-terminal-emulator isn't known, consider report it to LibFM developers
[...]
==> /home/lauscher/.cache/x11docker/X1/xinit.log <==
xinit: connection to X server lost

waiting for X server to shut down XIO:  fatal IO error 11 (Die Ressource ist zur Zeit nicht verfügbar) on X server ":1"
[...]
multitail ist für mich nicht sinnvoll, da es kein Bestandteil der Standardinstallation ist und ich die Abhängigkeiten so klein wie möglich halten will.

Danke!
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Antworten