Jak dowiedzieć się, który plik jest obecnie zapisywany przez proces

9

Moja sytuacja jest taka, że ​​od czasu do czasu określony proces (w tym przypadku jest to Thunderbird) przez około minutę nie reaguje na dane wejściowe użytkownika. Dowiedziałem się, iotopże w tym czasie zapisuje sporo na dysku, a teraz chcę dowiedzieć się, do którego pliku zapisuje, ale niestety iotoppodaje tylko statystyki na proces, a nie na otwarty plik (-descriptor).

Wiem, że mogę użyć, lsofaby dowiedzieć się, które pliki proces jest obecnie otwarty, ale oczywiście Thunderbird ma wiele otwartych, więc nie jest to takie pomocne. iostatpokazuje statystyki tylko na urządzenie.

Problem występuje tylko losowo i może minąć trochę czasu, zanim się pojawi, więc mam nadzieję, że nie muszę śledzić Thunderbirda i przeszukiwać długich dzienników, aby dowiedzieć się, który plik ma najwięcej zapisów.

Philipp Wendler
źródło
Zobacz także Rejestrowanie połączeń wychodzących w przypadku połączeń sieciowych
Gilles „SO - przestań być zły”

Odpowiedzi:

6

Jeśli podłączysz strace do procesu w momencie, gdy się zawiesi (możesz uzyskać pid i ustawić kolejkę polecenia z góry, w wolnym terminalu), wyświetli deskryptor pliku zapisu blokującego.

Trywialny przykład:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached
Nieprzydatny
źródło
Dzięki, nie wiedziałem, że mogę dołączyć strace podczas procesu. Spróbuję tego.
Philipp Wendler,
1
Możesz przekreślić te informacje lsof -p $PID, aby dowiedzieć się, gdzie wskazuje deskryptor pliku
Coren
1
lub ls -l /proc/pid/fdw systemie Linux
Bezużyteczne
Za pomocą strace mogłem dowiedzieć się dokładnie, co chciałem wiedzieć, więc jeszcze raz dziękuję!
Philipp Wendler
2

Mam dostęp do roota, myślę, że najlepszym narzędziem będzie podsystem kontroli . Nie ma o tym dużo literatury (ale więcej niż o loggedfs); można zacząć od tego tutoriala lub ciągu kilku przykładów czy tylko ze auditctlstrony człowieka . Tutaj powinno wystarczyć, aby upewnić się, że demon jest uruchomiony, a następnie uruchomić auditctljako root:

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

Spowoduje to zapis do dzienników za /var/log/audit/audit.logkażdym razem, gdy proces z pid 1234 zapisuje gdzieś pod /home/philipp. Koszty ogólne są dość małe, dużo mniejsze niż strace.

Gilles „SO- przestań być zły”
źródło
Dziękujemy za wskazanie podsystemów audytu jako ciekawej alternatywy dla strace. Nie wydaje się to jednak pomocne, ponieważ loguje się tylko wtedy, gdy plik jest otwarty, a zatem nie mogę dowiedzieć się, ile jest zapisanych w każdym pliku.
Philipp Wendler,
@PhilippWendler Ah. Hmmm. Spróbuj dodać -S read -S write(nieprzetestowane).
Gilles „SO- przestań być zły”