Bash Script, Log ausgabe friert ein.

R

rabadag

Mitglied
Hallo Forum, hab da etwas seltsammes wo ich nicht weiter komme.

Das Script selbst scheint einwandfrei zu funktioniren, nur wird die ausgabe in das logfile immer 5 min lang unterbrochen.

Ich weis nicht wo mein Fehler sein könnte, das die logfile immer einfrieren?
$PROGPATH ${d} 2>&1 > /var/log/new-${d}.log

hier mal mein code.

Code:
#!/bin/bash
PIDFILE=/var/run/car1.pid
PIDFILE2=/var/run/car2.pid
PIDFILE3=/var/run/new.pid
PROGRAM=car.i386
PROGPATH=/usr/local/etc/car1/car1.i386
PROGPATH1=/usr/local/etc/car1/2.i386
PROGPATHCS=/usr/local/etc/new/new.x86
PROGCONF="spezial.conf"
PROGDIR=/usr/local/etc/car1
PROGDIRCS=/usr/local/etc/new/configs
PROGARGS=""
DESC="Programm1 configs"
DESC1="Programm2 config"
DESC2="New"
ECHO=/bin/echo
HEAD=/usr/bin/head
KILL=/bin/kill
CAT=/bin/cat

if [ ! -x $ECHO ]; then
  exit 1
fi

  if [ ! -x $HEAD ]; then
    $ECHO "*** $0: error: $HEAD is needed and was not found."
      exit 1
fi

if [ ! -x $KILL ]; then
    $ECHO "*** $0: error: kill is needed and was not found."
    exit 1
fi
	  
if [ -z $1 ]; then
    $ECHO "USAGE: $0 <stop | start>"
    exit 1
fi
	      
	      
if [ ! -x $PROGPATH ]; then
    echo "$PROGPATH does not exist or is not executable."
    exit 1
fi

 
		  
case $1 in
        start)
	
          if [ -r $PIDFILE ]; then
            PID=$($CAT $PIDFILE)
	    			PID2=$($CAT $PIDFILE2)
	    			PID3=$($CAT $PIDFILE3)
	 
            if $($KILL -s CHLD $PID 2>&1 > /dev/null)
	    then
              echo "$DESC läuft bereits! run $0 stop und danach start"
		
		if $($KILL -s CHLD $PID2 2>&1 > /dev/null)
	    then
            echo "$DESC1 läuft bereits! run $0 stop und danach start"      
		fi

		if $($KILL -s CHLD $PID3 2>&1 > /dev/null)
	    then
            echo "$DESC3 läuft bereits! run $0 stop und danach start"      
		fi

	exit 1

            fi

          else
            $ECHO "Starte $DESC... und $DESC1 "
		cd $PROGDIR
		for d in `ls -a *.cfg`; do
    		$PROGPATH  ${d} 2>&1 > /var/log/car-${d}.log
		done
		
		cd $PROGDIRCS
		for e in `ls -a *.xml`; do
    		$PROGPATHCS -c $PROGDIRCS/${e} 2>&1 > /var/log/new-${e}.log
		done
		
		$PROGPATH1  $PROGCONF 2>&1 > /var/log/car-$PROGCONF.log
		
		ps aux | grep car1.i386 | grep -v grep | awk '{print $2}' > $PIDFILE;
		ps aux | grep car2.i386 | grep -v grep | awk '{print $2}' > $PIDFILE2;
		ps aux | grep new.i386 | grep -v grep | awk '{print $2}' > PIDFILE3;
		
		$ECHO "$DESC...${d} und $DESC2 ${e} sowie $DESC1 erfolgreich gestartet"
	fi        
        ;;
        stop)
          if [ -r $PIDFILE ]; then
            PID=$($CAT $PIDFILE)
            PID2=$($CAT $PIDFILE2)
            PID3=$($CAT $PIDFILE3)
		
	    $ECHO -n "Beende $DESC..."
 
            $KILL -s TERM $PID 2>&1 > /dev/null
 
            rm -f $PIDFILE 2>&1 > /dev/null
            
            $ECHO "$DESC.. erfogreich beendet Fertig."

            $ECHO -n "Beende $DESC1..."
 
            $KILL -s TERM $PID2 2>&1 > /dev/null
 
            rm -f $PIDFILE2 2>&1 > /dev/null
            
            $ECHO "$DESC1 erfogreich beendet Fertig."

  	    $ECHO -n "Beende $DESC2..."
 
            $KILL -s TERM $PID3 2>&1 > /dev/null
 
            rm -f $PIDFILE3 2>&1 > /dev/null
            
            $ECHO "$DESC2 erfogreich beendet Fertig."

          else
            echo "$DESC.. $DESC1..$DESC2 Sind nicht gestartet"
            exit 1
          fi
      ;;

*)

      $ECHO "USAGE: $0 <stop | start>"   
            exit 1
        ;;


esac
 
unset PIDFILE PROGRAM PROGPATH PROGARGS DESC ECHO HEAD KILL
 
exit 0
 
#EOF
;;
 
Zuletzt bearbeitet:
also im script sehe ich nichts was damit zu tun haben könnte.

aber hab ich das richtig verstanden, das schreiben in das logfile erfolgt alle 5 minuten?

wenn ja, tippe ich mal darauf das der stdout und stderr zeichenbuffer halt immer erst ab einer bestimmten grösse "geflusht" wird, also in das logfile geschrieben wird.

wie man das unter der bash abschaltet kann ich dir nicht sagen und hab jetzt auch auf die schnelle nix gefunden.

unter perl würde das so gehen:

Code:
$| = 1

unter der bash wird das ähnlich einfach sein. such halt mal. bzw. kann einer der mods hier bestimmt mehr dazu sagen.

warum hilft den mir nimand? keiner ne idee

und sei mal nicht so ungeduldig. wir sind schließlich kein bezahlter helpdesk hier.
 
Hallo supersucker

aber hab ich das richtig verstanden, das schreiben in das logfile erfolgt alle 5 minuten?

Fast...

Das logfile wird zwar geschriben bleibt dan stehen und mach 4 -5 min pause.
gehts weiter.

Einfach gesagt:
es werden etwa 20 Zeilen ins log geschrieben.
Dnach folgt eine Pause bis zu 5 Min.
Dann widerum ck 20 zeilen.

immer so weiter.

So sind keine Eintrage wärend den Pausen vorhanden die 4 - 5 Minuten Pause sind nirgens im log niedergeschrieben, als würde sich der logsys aufhängen.

Andere logs weisen diesen Fehler nicht auf.

Wenn ich das Programm manuel normal in der console starte und die ausgabe auf den ssh client habe sind keine Pausen sichtbar.

Ich denke das es mit der schlaufe zu tun hat..

Code:
PRODIR=/usr/local/etc/prog
PROGPATH=/usr/local/etc/prog/execute.i386
cd $PROGDIR
		for d in `ls -a *.cfg`; do
    		$PROGPATH  ${d} 2>&1 > /var/log/car-${d}.log
		done

wenn ich es manuel starten würde, dan so.


Code:
 cd /usr/local/etc/prog
 /usr/local/etc/prog/execute.i386 /usr/local/etc/prog/config.cfg 2>&1 > /var/log/car-logfile.log

Das müste ich dan aber 5 mal manuel starten, da ja 5 Configs vorligen. deshalb die schleife..
 
Hallo

Ich kann hier keinen offensichtlichen Fehler erkennen.
Eventuell solltest du das mal mit set -x durchlaufen lassen und dir die einzelnen Variablen anzeigen lassen.
Leider kenne ich weder dein genaues Ziel, noch die Umgebung.
Im Zweifelsfall, könntest du dich mittels echo an diversen Stellen durchhangeln.
So debugge ich wenigstens diverse Scripte mit unerwarteten Ergebnissen.

Gruß Wolfgang
 
Hallo Wolfgang

Ich war mal kurz weg "Spital Aufenthalt" naja nun wider online.

was meinst du mit set -x
und wo muss ich das den einsetzen?

Ich denke es igt nicht an dem script, den auch eine manuelle
umleitung in der console mittels.
/usr/local/etc/program1.i386 config1.cfg >> /var/log/programm1.log

Macht das selbe. Auch wider 4-5 minuten keine Einträge im Log.

Die ausgabe auf der console weist diesen fehler nicht auf.
 
Huhu rabadag,

hoffentlich bist wieder gesund..?!
Also mit 'set -x' kannst du debuggen und ausschalten kannst du es mit 'set +x'.
Du kannst es an eine beliebige Stelle in deinem Code schreiben. Oder sogar auch in die She-Bang Zeile ganz am Anfang...dann aber ohne set, also so:
Code:
# !/bin/bash -x
Hmm...vielleicht würde hier eine FIFO helfen???
 
:brav: Ja bin wider gesund. Mein aufenthalt im Spital war durch ein sehr starken Hexenschuss unvermeidbar. Lag bei mir Zuhause auf dem Boden und konnte mich keinen milimeter mer bewegen.

Aber jetz is alles wider ok.



OK danke für den tip werd ich gleich mal testen.

PS: Ich hab wohl noch ne info vergessen, das Programm das gestartet wird läuft 24 Std. duch also ist das logfile immer in use.

dachte es könnte noch wichtig sein.



hmm..
Ergebnis:
also das loggen hat nichts gebracht, keine fehler oder errors.
dan hab ich mal versucht anstelle von

$PROGPATH1 $PROGCONF 2>&1 > /var/log/car-$PROGCONF.log

mit
$PROGPATH1 $PROGCONF

und sihe da alles ist auf der console sichtbar keine unterbrüche..

es muss irgenwas mit dem schreiben ins logfile schifgehen aber was..
kann ich das eventuel mit tee oder teil greppen und dan in ein log schreiben?
 
Zuletzt bearbeitet:
rabadag schrieb:
es muss irgenwas mit dem schreiben ins logfile schifgehen aber was..
kann ich das eventuel mit tee oder teil greppen und dan in ein log schreiben?
das ist imho das normale stdio buffering in der shell, output auf die console ist line buffered, daher siehst du das sofort, output in einen file ist block buffered
 
ninguno schrieb:
das ist imho das normale stdio buffering in der shell, output auf die console ist line buffered, daher siehst du das sofort, output in einen file ist block buffered

danke für die Antwort, aber das hilft mir nicht weiter.

Wie grige ich das hin das ich alles im logfile habe und nicht nur bruchstüke.
 
Du meinst es fehlen devinitiv Zeilen? Hast Du denn schon mal versucht, wie du schon sagtest, mit tee die Ausgabe auf stdout und zusätzlich ins Logfile umzuleiten, um dann die beiden Ausgaben zu vergleichen, ob denn wirklich Zeilen fehlen??

btw: könntest Du bitte etwas mehr auf Deine Rechtschreibung achten? Danke.
 
Schlaubi_fi.de schrieb:
Du meinst es fehlen devinitiv Zeilen? Hast Du denn schon mal versucht, wie du schon sagtest, mit tee die Ausgabe auf stdout und zusätzlich ins Logfile umzuleiten, um dann die beiden Ausgaben zu vergleichen, ob denn wirklich Zeilen fehlen??

btw: könntest Du bitte etwas mehr auf Deine Rechtschreibung achten? Danke.

Klaro.

Ja hab ich schon versucht, mit selben Ergebnis.
$PROGPATH1 $PROGCONF 2>&1 > | tee -a /var/log/car-$PROGCONF.log

hat alles nichts gebracht..
 
Zuletzt bearbeitet:

Ähnliche Themen

NAS-Drive Mount in Bash-Script über crontab

script sshpass

Verschlüsseltes Backup-Script mit rsync

Crontab und Scripts - Problem

Shellscript unerwartetes Dateiende

Zurück
Oben