Gelöschte Logfiles retten

Frage: Was tut man, wenn man sich aus Versehen ein wichtiges Logfile gelöscht hat? Also z.B. /var/log/httpd/access_log?

Antwort: Wenn man den Dienst, der das Logfile offen hält, neu gestartet oder ihm ein SIGHUP (SIGUSR1i, $WHATEVER der Prozess halt braucht, um Logfiles neu zu öffnen) geschickt hat, dann tut man gar nichts, denn dann hat man verloren. Hat man das aber nicht getan, dann gibt es das File noch auf der Platte - denn “ein offenes Filehandle ist ein offenes Filehandle ist ein offenes Filehandle”, wie Frank sagen würde. Und wir kommen da jederzeit über das /proc-Filesystem ran. Das vorgehen ist denkbar einfach - im ersten Schritt suchen wir die Prozessnummer und die Nummer des FD raus:

lsof | grep $LOGFILENAME

In der ersten Spalte steht dabei der Prozessname, in der zweiten die PID und in der vierten der FD. Angenommen, die PID sei “1710” und das Filehandle “11w”, dann finden wir das File hier:

cat /proc/1710/fd/11
# allgemeiner: cat /proc/$PID/fd/$FD

Alles halb so wild.