Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:sysadmin:tools:pidfileremover

pidfileremover

Angenommen man hat eine komplexe historisch gewachsene (*seufz*) Umgebung mehrere Server … 1)

In dieser Umgebung gibt es Startupscripts, die PID-Files anlegen (welche root gehören). Die PID-Files bleiben liegen – so die Maschine abraucht (oder Strom verliert oder ….). Beim folgendem Neustart der Maschine sind die Startup-Scripts leider zu doof, die PID-Files selbst wieder wegzuräumen und können den Dienst deswegen nicht starten.

Da das ganze eine tiefe Verschachtlung von (insgesamt nicht ganz sinnlosen) Scripts mit mehrfachen Privilegienwechseln ist, will und kann man das jetzt auch nicht ohne sehr grossen Aufwand alles neu schreiben.

Das folgende Script muss dann nur noch an passender Stelle beim Booten aufgerufen werden (z.B. ins rc-script oder in /etc/conf.d/local.start bei Gentoo)

#!/bin/bash
 
# pidfileremover loescht die laestigen uebriggebliebenen
# pid-dateien die vor allem dann entstehen, wenn die
# maschine ploetzlich abraucht
 
# nur pid-files sollen geloescht werden, bei denen kein
# prozess mehr vorhanden ist
 
# optional kann man eine Datei angeben, die geprueft
# und gegebenenfalls geloescht wird
 
export PATH="/sbin:/usr/sbin:/usr/bin:/bin"
 
pidfiledirs="/tmp /var/tmp"
 
removepidfile()
{
    if [[ -f $file ]] ; then
      if [[ -h $file ]] ; then
        echo -n "$file ist symlink ..."
        echo " wird NICHT geloescht"
        return 10
      fi
 
      eigentuemer=`stat -c %U $file`
 
      if [[ $eigentuemer != "root" ]] ; then
        echo -n "$file gehoert nicht root ..."
        echo " wird NICHT geloescht"
        return 20
      fi
 
      pid=`cat $file`
 
      if ! echo $pid | grep "^[0-9]*$">/dev/null
      then
        echo "$file enthaelt keine gueltige pid ($pid)"
        return 40
      fi
 
      ps -e | grep $pid | grep -v grep > /dev/null
 
      if [[ $? -eq 0 ]]; then
        echo -n "Prozess mit passender PID gefunden ..."
        echo " $file wird NICHT geloescht"
        return 80
      fi
 
      echo "$file wird GELOESCHT"
      rm $file
 
    fi
 
}
 
if [[ -n $1 ]]; then
  file=$1
  removepidfile
else
  for dir in $pidfiledirs; do
    for file in $dir/*pid ; do
      removepidfile
    done
  done
fi

wenn jemand Verbesserungsvorschläge hat oder bedenkenswerte Ansätze, warum das hier auch schiefgehen kann: immer her damit!

1) so fangen viele traurige Sysadmin-Stories an :-?
de/sysadmin/tools/pidfileremover.txt · Zuletzt geändert: 2009-07-24 18:42 von hella

Seiten-Werkzeuge