time
adalah perintah yang brilian jika Anda ingin mengetahui berapa banyak waktu CPU yang diberikan perintah.
Saya mencari sesuatu yang mirip yang dapat membuat daftar file yang sedang diakses oleh suatu program dan anak-anaknya. Baik secara real time atau sebagai laporan sesudahnya.
Saat ini saya menggunakan:
#!/bin/bash
strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
tetapi gagal jika perintah untuk menjalankan melibatkan sudo
. Ini tidak terlalu cerdas (alangkah baiknya jika hanya bisa mendaftar file yang ada atau yang memiliki masalah izin atau mengelompokkannya ke dalam file yang dibaca dan file yang ditulis). Juga strace
lambat, jadi akan lebih baik dengan pilihan yang lebih cepat.
files
monitoring
strace
Ole Tange
sumber
sumber
strace
, saya menganggap Anda secara khusus tertarik pada Linux. Benar?Jawaban:
Saya menyerah dan memberi kode alat saya sendiri. Mengutip dari dokumennya:
Ini hanya menampilkan file sehingga Anda tidak perlu berurusan dengan output dari
strace
.https://gitlab.com/ole.tange/tangetools/tree/master/tracefile
sumber
make && sudo make install
. Maka Anda bisa lariman tracefile
.yum -y install https://extras.getpagespeed.com/release-el7-latest.rpm
danyum -y install tracefile
Anda dapat melacak panggilan sistem dengan
strace
, tetapi memang ada penalti kecepatan yang tak terelakkan. Anda perlu menjalankanstrace
sebagai root jika perintah dijalankan dengan hak istimewa yang ditinggikan:Metode lain yang mungkin lebih cepat adalah untuk preload perpustakaan yang membungkus di sekitar fungsi akses filesystem:
LD_PRELOAD=/path/to/libmywrapper.so mycommand
. TheLD_PRELOAD
variabel lingkungan tidak akan diteruskan ke program dipanggil dengan hak tinggi. Anda harus menulis kode perpustakaan pembungkus itu ( inilah contoh dari “Membangun perpustakaan penukar untuk kesenangan dan keuntungan” ); Saya tidak tahu apakah ada kode yang dapat digunakan kembali tersedia di web.Jika Anda memantau file dalam hierarki direktori tertentu, Anda dapat membuat tampilan sistem file dengan LoggedFS sehingga semua akses melalui tampilan itu dicatat.
Untuk mengkonfigurasi LoggedFS, mulailah dengan konfigurasi sampel yang dikirimkan bersama program dan baca sintaksis file konfigurasi LoggedFS .
Kemungkinan lain adalah subsistem audit Linux . Pastikan
auditd
daemon dimulai, kemudian konfigurasikan dengan apa Anda ingin loginauditctl
. Setiap operasi yang dicatat dicatat dalam/var/log/audit/audit.log
(pada distribusi tipikal). Untuk mulai menonton file tertentu:Jika Anda menaruh arloji di direktori, file di dalamnya dan subdirektori secara rekursif juga ditonton. Berhati-hatilah untuk tidak melihat direktori yang berisi log audit. Anda dapat membatasi penebangan untuk proses tertentu, lihat
auditctl
halaman manual untuk filter yang tersedia. Anda harus menjadi root untuk menggunakan sistem audit.sumber
LD_PRELOAD
juga tidak akan berfungsi pada binari statis.Saya pikir Anda ingin lsof (mungkin disalurkan ke grep pada program dan itu anak-anak). Ini akan memberi tahu Anda setiap file yang saat ini sedang diakses di sistem file. Untuk informasi tentang file mana yang diakses oleh proses ( dari sini ):
sumber
Saya mencobanya
tracefile
. Bagi saya itu memberi jauh lebih sedikit pertandingan daripada saya sendiristrace ... | sed ... | sort -u
. Saya bahkan menambahkan-s256
kestrace(1)
baris perintah tetapi tidak banyak membantu ...Kemudian saya mencobanya
loggedfs
. Pertama gagal karena saya tidak punya akses baca / tulis ke direktori saya mencoba login dengannya. Setelah melakukan chmod 755 sementara saya mendapatkan beberapa hit ...Tetapi, bagi saya, melakukan hal berikut tampaknya bekerja paling baik:
inotifywait -m -r -e OPEN /path/to/traced/directory
Dan kemudian postprocess output setelah menjalankan proses yang menarik.
Ini tidak menangkap file proses akses luar direktori dilacak atau ini tidak tahu apakah beberapa proses lain mengakses pohon direktori yang sama, tetapi dalam banyak kasus ini adalah alat yang cukup baik untuk menyelesaikan pekerjaan.
EDIT: inotifywait tidak menangkap akses symlink (hanya target setelah symlink diselesaikan). Saya terpana oleh hal ini ketika saya mengarsipkan perpustakaan yang diakses oleh sebuah program untuk digunakan di masa depan. Menggunakan beberapa peretasan perl perl tambahan untuk memilih symlink di sepanjang perpustakaan yang diberitahukan untuk menyelesaikan pekerjaan dalam satu kasus tertentu.
EDIT2: setidaknya ketika inotifying file dan symlinks sendiri dari inotifywait baris perintah (misalnya
inotifywait -m file symlink
atauinotifywait symlink file
) output akan menunjukkan akses ke mana yang pertama di baris perintah (terlepas dari mana,file
darisymlink
diakses). inotifywait tidak mendukung IN_DONT_FOLLOW - yang, ketika saya coba secara terprogram hanya membuat orang melihat akses kefile
(yang mungkin, atau mungkin tidak, menjadi apa yang diharapkan ...) terlepas dari pesanan dalam baris perintahsumber
tracefile
kehilangan akses file?Walaupun mungkin tidak memberi Anda cukup kontrol (belum?) Saya telah menulis sebuah program, yang setidaknya sebagian memenuhi kebutuhan Anda, menggunakan fanotify dan unshare linux-kernel untuk memantau hanya file yang dimodifikasi (atau dibaca) oleh proses tertentu dan anak-anaknya . Dibandingkan dengan strace, ini cukup cepat (;
Itu dapat ditemukan di https://github.com/tycho-kirchner/shournal
Contoh pada shell:
sumber