Tip des Tages: Öfters mal Logfiles rotieren

Tomcat Logfiles können lang werden, daher sollte man diese desöftern rotieren.

Ganz unproblematisch ist das beim Tomcat aber nicht, denn im Gegensatz zu PHP Webanwendungen, stehen hier die Sessioninfos im RAM und nicht auf der Platte. Das hat beim Tomcat einen enormen Vorteil, weil der Server deutlich schneller an Infos kommt, als es z.B. PHP kann.

Der Nachteil liegt auf der Hand:  ein Neustart zerstört auch immer die Sessioninformationen. Gerade bei Shops ist das ein Problem. Hier muß die Sessionverwaltung dann auf Datenbanken ausgelagert werden, was bei verteilten Webanwendungen ohnehin gemacht werden muß.

Wo würde man daher das Logrotate ansetzen ?

Wer Serverdienste einsetzt, der braucht auch immer ein Startscript. Tomcat kommt zwar mit seinem eigenen startup.sh daher, aber auf ein klassisches Startscript ala init.d kann man eigentlich nicht verzichten. Hier ein Ausschnitt:

export CATALINA_HOME=/java/tomcat

ulimit -v unlimited -d unlimited -s unlimited -n 20000

PATH=$PATH:/usr/local/bin/

# See how we were called.
case "$1" in
 start)
 echo -n "Starting tomcat : "
 daemon /java/tomcat/bin/startup.sh
 RETVAL=$?
 echo
 ;;
 stop)
 echo -n "Stopping tomcat : "
 killtomcat
 RETVAL=$?
 echo
 ;;
 status)
 status tomcat
 RETVAL=$?
 ;;
 restart)
 $0 stop
 $0 start
 RETVAL=$?
 ;;
 *)
 echo "Usage: tomcat {start|stop|status|restart}"
 exit 1
esac

exit $RETVAL

und genau hier setzen wir an :

# See how we were called.
case "$1" in
 start)
 echo -n "Rotating Logs : "
 cd /usr/java/apache-tomcat/logs/
 echo "Deleting old files : "
 find . -ctime +100 -name "catalina.out*" -exec rm -fv {} \;
 COUNTER=0
 while [ $COUNTER -lt 99 ]; do
       echo The counter is $COUNTER
       let COUNTER=COUNTER+1
       if [ ! -f "catalina.out.$COUNTER" ]; then
           FILENAME="catalina.out.$COUNTER";
           break;
       fi
 done
 echo "Benutze $FILENAME";
 mv catalina.out $FILENAME
 echo "Compressing Logfile : $FILENAME"
 bzip2 -9 $FILENAME
 echo -n "Starting tomcat : "
 daemon /java/tomcat/bin/startup.sh
 RETVAL=$?
 echo
 ;;

Dieses Script ist natürlich nur ein Beispiel. Ihr müßt es noch anpassen an Eure Pfade und Präferenzen. Es wird Logfiles löschen, die älter als 100 Tage sind und maximal bis .99 zählen. Das kann je nach Häufigkeit des Starts Eures Tomcats dann eventuell nicht passen. Da müßt Ihr jetzt Eure Erfahrungen für Eurer System berücksichtigen.

Bitte beachtet, daß BZIP2 ein echter Zeitfresser ist, besonders in der Kombination mit 8 GB Logfile und -9 Option. Das packt hier auf einem nicht langsamen Server bereits seit 50 MInuten 😉 Das Ergebnis ist allerdings genial:

catalina.out.5: 53.987:1, 0.148 bits/byte, 98.15% saved, 8.250.838.531 in, 152.828.685 out.

Unter 2 % sind vom Logfile übrig geblieben 🙂

Wer jetzt meint, daß dieser Beitrag den 50 Minuten geschuldet ist, hat recht 😀 War leider ein echter Blocker.

 

Wie man in Bash Strings partiell vergleicht

Bash Stringvergleiche sind einfach :

if [ "$a" == "$b" ]; then 
          echo "gleich"
fi

Aber manchmal will man ja was auch nur Teilmengen vergleichen. Dazu braucht man die Doppelklammer und die Wildcards:

if [[ "$CERTNAME" == *"$HOSTNAME"* ]]; then
        echo "Teilvergleich erfolgreich"
fi

Wenn also HOSTNAME ein Teil von CERTNAME ist, dann trifft das obige zu. Wenn man == durch != ersetzt, kann man das Gegenteil abfragen. Es gibt aber noch einen anderen Weg, über RegExpressions:

if [[ "$CERTNAME" =~ .*$HOSTNAME.* ]]; then
   echo "RegExp ist gültig"
fi

Das hat den Vorteil, daß es auch etwas komplizierteres sein darf:

if [[ "$A" =~ .*(ab|vom).* ]]; then

Viel Spaß damit.

Cinnamondesktop entfernen, entfernt die falschen Pakete

Vor ein paar Tagen habe ich ja den Cinnamondesktop auf Fedora+Gnome nachinstalliert, und wollte das nun wieder entfernen. Leider entfernt „dnf erase @Cinnamon-Desktop“ einige wichtige Programme, die mit Gnome installiert wurden. Das führt natürlich zu dem Problem, daß man genau diese Pakete wieder installieren muß und dazu eine Liste braucht.

Wie macht man das ?

Abgleichen natürlich. Zunächst brauchen wir die Liste mit den RPMS, die installiert wurden:

grep -i -E „^Jul 01.*fc23“ /var/log/dnf.log-20160704  | grep install | awk ‚{print $7;}‘ | sort >/root/liste.install

Dazu muß man natürlich wissen, wann man Cinnamon installiert hat, in meinem Fall am „Jul 01“ .

Daran denken: An dem Tag können noch andere Pakete installiert worden sein, also ggf. den Grep um die Uhrzeit erweitern!

Jetzt brauchen wir noch die gleiche Liste für die entfernten Pakete:

grep -i -E „^Jul 06.*fc23“ /var/log/dnf.log  | grep erased | awk ‚{print $7;}‘ | sort >/root/liste.erased

Wie bei den Installdaten, könnten auch hier noch andere Pakete deinstalliert worden sein, also auch hier ggf. die Uhrzeit einbauen!

Wer nachvollziehen will, was die einzelnen Befehle machen, kann Sie auch einzeln aufrufen :

grep -i -E „^Jul 06.*fc23“ /var/log/dnf.log  | grep erased | awk ‚{print $7;}‘ | sort
grep -i -E „^Jul 06.*fc23“ /var/log/dnf.log  | grep erased | awk ‚{print $7;}‘
grep -i -E „^Jul 06.*fc23“ /var/log/dnf.log  | grep erased
grep -i -E „^Jul 06.*fc23“ /var/log/dnf.log

Nun hat man zwei Listen mit Paketen. Alle die Pakete, die nicht in der Install-Liste sind, aber in der Erased-Liste, müssen wieder auf den Rechner drauf.

Jetzt könnte es soooo einfach sein :

grep -vf /root/liste.install /root/liste.erased

Ist es aber nicht, denn die Listen passen nicht zusammen. Wir müssen die Paketnamen erst normieren:

sed -e „s/\.x86_64//“ /root/liste.install > /root/liste.install2

sed -e „s/\.fc23.*//“ -e „s/:.*$//“ -e „s/-[0-9].*//“ /root/liste.erased  > /root/liste.erased2

Jetzt können wir Sie vergleichen :

grep -vf /root/liste.install2 /root/liste.erased2

Das zeigt alle Tools an, die in der Install-Liste fehlen, also zuviel deinstalliert wurden.

Das sollte man jetzt von Hand nochmal aussortieren, aber zur Not ginge auch:

grep -vf /root/liste.install2 /root/liste.erased2 | awk ‚{print „dnf -y install „$1;}‘ | bash

und alles würde automatisch installiert werden.

ACHTUNG: Hinweis für spätere Zeiten :

Als dieser Artikel geschrieben wurde, war Fedora 23 aktuell auf einem 64Bit System installiert. Wer andere Versionen einsetzt, muß die ganzen Anweisungen selber sinnvoll anpassen.