Odzyskanie usuniętego loga pracującego daemona

Czy zdarzyło się Wam przypadkiem usunąć plik loga pracującej aplikacji? Jeśli tak, ale daemon tej aplikacji wciąż pracuje, to można go przywrócić. Pokażę to na przykładzie.
Apache uruchomiony testowo na moim desktopie  loguje do trzech poniższych plików:

[email protected]:~# ls -l /var/log/apache2/*.log
-rw-r----- 1 root adm 1008 2010-03-19 16:17 /var/log/apache2/access.log
-rw-r----- 1 root adm 998 2010-03-19 16:17 /var/log/apache2/error.log
-rw-r--r-- 1 root root 0 2009-11-25 13:53 /var/log/apache2/other_vhosts_access.log

Usuwam np. plik access.log:

[email protected]:~# rm -v /var/log/apache2/access.log
usunięty `/var/log/apache2/access.log'

1. Szukam głównego PID'a procesu Apache:

[email protected]:~# ps -ef | grep apache
root 3323 1 0 Mar17 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 3324 3323 0 Mar17 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 3327 3323 0 Mar17 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 24579 3323 0 08:13 ? 00:00:00 /usr/sbin/apache2 -k start

2. Sprawdzam deskryptory plików dla tego PID'a:

[email protected]:~# ls -l /proc/3323/fd/ | grep apache
l-wx------ 1 root root 64 2010-03-19 23:37 2 -> /var/log/apache2/error.log
l-wx------ 1 root root 64 2010-03-19 23:37 7 -> /var/log/apache2/other_vhosts_access.log
l-wx------ 1 root root 64 2010-03-19 23:37 8 -> /var/log/apache2/access.log (deleted)

3. Przepisuję plik z deskryptora do pliku loga (można użyć również cp albo dd):

[email protected]:~# cat /proc/3323/fd/8 > /var/log/apache2/access.log

I już skasowany plik jest na "swoim miejscu":

[email protected]:~# ls -l /var/log/apache2/*.log
-rw-r--r-- 1 root root 1008 2010-03-19 23:40 /var/log/apache2/access.log
-rw-r----- 1 root adm 998 2010-03-19 16:17 /var/log/apache2/error.log
-rw-r--r-- 1 root root 0 2009-11-25 13:53 /var/log/apache2/other_vhosts_access.log

Warto pod koniec wspomnieć, że usunięcie plików logów na partycji z kończącym się miejscem nie zawsze oznacza faktyczne zwolnienie miejsca, jeśli deskryptory tych plików są nadal otwarte. Ale to już jeden z tematów na inny artykuł. :-)

  • Jarosław Nyka

    Zawsze mnie interesowało jak odzyskać plik który został przypadkowo usunięty z dysku (ufs2).

  • WeeD

    bo logi najlepiej usuwac poleceniem:
    cat /dev/null > /var/log/apache2/access.log