Cara mengetahui file mana yang saat ini ditulis oleh suatu proses

9

Situasi saya adalah bahwa dari waktu ke waktu proses tertentu (dalam hal ini, ini Thunderbird) tidak bereaksi terhadap input pengguna selama satu menit atau lebih. Saya menemukan menggunakan iotopitu selama ini, itu menulis cukup banyak ke disk, dan sekarang saya ingin mencari tahu file yang ditulisnya, tetapi sayangnya iotophanya memberikan statistik per proses dan tidak per file yang terbuka (-description).

Saya tahu bahwa saya dapat menggunakannya lsofuntuk mencari tahu file mana yang prosesnya sedang terbuka, tetapi tentu saja Thunderbird telah membuka banyak file, jadi ini tidak terlalu membantu. iostathanya menampilkan statistik per perangkat.

Masalahnya terjadi hanya secara acak dan mungkin butuh beberapa waktu untuk muncul, jadi saya harap saya tidak perlu strace Thunderbird dan memeriksa log panjang untuk mengetahui file mana yang paling banyak menulis.

Philipp Wendler
sumber
Lihat juga Logging koneksi keluar saat mereka terjadi untuk koneksi jaringan
Gilles 'SO- stop being evil'

Jawaban:

6

Jika Anda melampirkan strace ke proses tepat ketika itu digantung (Anda bisa mendapatkan pid dan mengantri perintah di muka, di terminal cadangan), itu akan menampilkan deskriptor file dari penulisan pemblokiran.

Contoh sepele:

$ 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
Tak berguna
sumber
Terima kasih, saya tidak tahu saya bisa memasang strace saat proses sedang berjalan. Saya akan coba ini.
Philipp Wendler
1
Anda dapat mencoret informasi ini dengan lsof -p $PID, untuk mengetahui di mana file deskriptor menunjuk
Coren
1
atau ls -l /proc/pid/fddi Linux
berguna
Menggunakan strace saya benar-benar bisa mengetahui dengan tepat apa yang ingin saya ketahui, jadi terima kasih lagi!
Philipp Wendler
2

Jika Anda memiliki akses root, saya pikir alat terbaik adalah subsistem audit . Tidak banyak literatur tentang itu (tetapi lebih dari tentang logf); Anda bisa mulai dengan tutorial ini atau sebuah beberapa contoh atau hanya dengan auditctlhalaman manual . Di sini, itu harus cukup untuk memastikan daemon dimulai, kemudian jalankan auditctlsebagai root:

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

Ini akan menulis ke log di /var/log/audit/audit.logsetiap kali proses dengan pid 1234 menulis di suatu tempat di bawah /home/philipp. Biaya overhead cukup kecil, jauh lebih kecil daripada strace.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih telah menunjukkan subsistem audit sebagai alternatif yang menarik untuk strace. Namun, sepertinya tidak membantu di sini karena sepertinya hanya mencatat ketika file dibuka, dan dengan demikian saya tidak bisa mengetahui berapa banyak yang ditulis ke dalam setiap file.
Philipp Wendler
@PhilippWendler Ah. Hmmm. Coba tambahkan -S read -S write(belum diuji).
Gilles 'SO- stop being evil'