Bir program tarafından erişilen dosyaları listeleme


64

time Belirli bir komutun ne kadar zaman harcadığını hesaplamak istiyorsanız mükemmel bir komuttur.

Bir program ve çocukları tarafından erişilen dosyaları listeleyebilecek benzer bir şey arıyorum. Ya gerçek zamanlı olarak ya da daha sonra bir rapor olarak.

Şu anda kullanıyorum:

#!/bin/bash

strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'

ancak çalıştırılacak komut içeriyorsa başarısız olur sudo. Çok zekice değil (yalnızca varolan veya izin sorunları olan dosyaları listeleyebilseydi veya bunları okuyan ve yazılan dosyalar halinde gruplandırabilirse iyi olurdu). Ayrıca straceyavaş, bu yüzden daha hızlı bir seçim ile iyi olurdu.


Kullanımınız göz önüne alındığında, straceözellikle Linux ile ilgilendiğinizi farz ediyorum. Doğru?
Gilles,

Linux benim öncelikli endişem.
Ole Tange,

Yanıtlar:


51

Vazgeçtim ve kendi aracımı kodladım. Dokümanlarından alıntı yapmak için:

SYNOPSIS
    tracefile [-adefnu] command
    tracefile [-adefnu] -p pid

OPTIONS
    -a        List all files
    -d        List only dirs
    -e        List only existing files
    -f        List only files
    -n        List only non-existing files
    -p pid    Trace process id
    -u        List only files once

Yalnızca dosyaları çıkarır, böylece çıktıyla uğraşmanıza gerek kalmaz strace.

https://gitlab.com/ole.tange/tangetools/tree/master/tracefile


Teşekkürler! strace'ın çıktısı kesinlikle okunamıyor. Belgeleri nerede bulacağımı bilmiyorum - bir -h / - yardım seçeneği olsa iyi olurdu. Ayrıca, erişime değil, yalnızca dosya düzenlemelerini gösteren bir seçeneği de takdir ediyorum.
Xerus,

@Xerus Clone gitlab.com/ole.tange/tangetools ve çalıştırın make && sudo make install. Sonra koşabilirsin man tracefile.
Ole Tange

4
Güzel alet. Yüklemek için paketlenmiş: yum -y install https://extras.getpagespeed.com/release-el7-latest.rpmveyum -y install tracefile
Danila Vershinin 24:18

27

Sistem çağrıları ile takip edebilirsiniz strace, ancak gerçekten kaçınılmaz bir hız cezası var. straceKomut yükseltilmiş ayrıcalıklarla çalışıyorsa, root olarak çalıştırmanız gerekir :

sudo strace -f -o foo.trace su user -c 'mycommand'

Daha hızlı olması olasıdır başka yöntem dosya sistemi erişim fonksiyonları sarar kütüphane önceden yüklemek için: LD_PRELOAD=/path/to/libmywrapper.so mycommand. LD_PRELOADOrtam değişkeni yükseltilmiş ayrıcalıklarla çağrılan programlara aktarılmaz. Bu sarmalayıcı kütüphanesinin kodunu yazmanız gerekir ( işte “Eğlence ve kâr için kitaplık aracı oluşturma” örneği ); İnternette tekrar kullanılabilir bir kod olup olmadığını bilmiyorum.

Dosyaları belirli bir dizin hiyerarşisinde izliyorsanız , dosya görünümünü LoggedFS ile görüntüleyerek tüm görünümlerin o erişim yoluyla kaydedilmesini sağlayabilirsiniz.

loggedfs -c my-loggedfs.xml /logged-view
mycommand /logged-view/somedir

LoggedFS'yi yapılandırmak için programla birlikte gönderilen örnek yapılandırma ile başlayın ve LoggedFS yapılandırma dosyası sözdizimini okuyun .

Başka bir olasılık, Linux'un denetim alt sistemidir . auditdArka plan programının başlatıldığından emin olun , ardından ne yapmak istediğinizi yapılandırın auditctl. Kaydedilen her işlem /var/log/audit/audit.log(tipik dağıtımlarda) olarak kaydedilir . Belirli bir dosyayı izlemeye başlamak için:

auditctl -a exit,always -w /path/to/file

Bir dizine saat koyarsanız, içindeki dosyalar ve alt dizinleri art arda izlenir. Denetim kayıtlarını içeren dizini izlememeye dikkat edin. Günlüğe kaydetmeyi belirli işlemlerle sınırlandırabilirsiniz auditctl, mevcut filtreler için kılavuz sayfasına bakın . Denetim sistemini kullanmak için kök olmanız gerekir.


LD_PRELOADAyrıca statik ikili dosyalar üzerinde çalışmaz.
David

6

Sanırım istediğini istediğin zaman (muhtemelen programa ve bir çocuk programına atılmış). Size şu anda dosya sisteminde erişilen her dosyayı size söyleyecektir. Hangi dosyalara işlem tarafından erişildiği hakkında bilgi için ( buradan ):

lsof -n -p `pidof your_app`

11
Ama bu bana sadece bir anlık görüntü veriyor. İhtiyacım olan, hangi dosyalara erişmeye çalıştığı. Bir programın başlatmayı reddettiği durumu düşünün çünkü "Eksik dosya" yazıyor. Hangi dosyayı aradığını nasıl bulabilirim?
Ole Tange,

2

Bunu denedim tracefile. Benim için kendime göre çok daha az kibrit verdi strace ... | sed ... | sort -u. Hatta ilave -s256etmek strace(1)komut satırına ama çok yardımcı olmadı ...

Sonra denedim loggedfs. Öncelikle, oturum açmaya çalıştığım dizine okuma / yazma erişimim olmadığı için başarısız oldu. Chmod 755'i geçici olarak yaptıktan sonra bazı isabetler aldım ...

Ancak, benim için, aşağıdakileri yapmak en iyisidir:

inotifywait -m -r -e OPEN /path/to/traced/directory

Ve sonra ilgilenilen süreci çalıştırdıktan sonra çıktıyı işleyin.

Bu işlem, izlenen dizinin dosya erişim erişim ağına yetişmez ve bu, başka bir işlemin aynı dizin ağacına erişip erişmediğini bilmez, ancak çoğu durumda bu işin yapılması için yeterli bir araçtır.

EDIT: inotifywait, sembolik bağlantı erişimini yakalamıyor (sembolik bağlantılar çözüldükten sonraki hedefler). Gelecekte kullanım için bir program tarafından erişilen kütüphaneleri arşivlediğimde buna çarpıldım. Belirli bir durumda işi yapmak için bildirilen kitaplıklardaki sembolik bağları toplamak için bazı ekstra perl korsanları kullandı.

EDIT2: en azından dosyaları inotifiye ederken ve kendilerini inotifywait komut satırından (örn. inotifywait -m file symlinkVeya inotifywait symlink file) çıkarıp aldıklarında, hangisinin komut satırında hangisine ilk erişildiğini gösterir file( symlinkhangisine erişilmiş olursa olsun ). inotifywait, IN_DONT_FOLLOW'u desteklemiyor - programlı olarak denediğimde file, komut satırındaki sırasına bakılmaksızın, yalnızca birini programlı olarak denediğimde (ki bu beklediği gibi olabilir ...) sadece bir erişim sağlar.


“Benim için kendimden çok daha az eşleşme verdi” tracefileBir dosya erişiminin eksik olduğu örneğini paylaşır mısınız?
Ole Tange

Tam olarak ne sorduğunuzu bilmiyorum:) ... Eğer / path / to / traced / directory / içindeki dosyalara bakmaya çalışırsam, çıktı çıktısında OPEN görüyorum ... AMA stat (1) sanırım dosyaları denedim birkaç davada sonuç alamamış (nedenini merak ediyorum, bazı önbellek dizini içeriğini okumaktan saklıyor)
Tomi Ollila

Aşağıdaki fanotify gönderisini yorumluyorum (on yıldan uzun bir süredir hesabım olmasına rağmen sadece 21 itibarım var; yorum yapmak için 50'yi istemek her zaman benim için engel oldu ...) - fanotify iyi şeyler, ama yapamam sembolik bağ KQUEUE soruna gitmek (sembolik durumunda, erişilen son dosya okuma / proc / öz tarafından bulunursa, yani / fd / <fd> .. Neyse 1: cevabı ing: D
Tomi Ollila

1

Size yeterince kontrol sağlamayacak olsa da (henüz?) En azından kısmen ihtiyaçlarınızı karşılayan bir program yazdım, linux-çekirdeğin fanotifini kullanarak, sadece belirli bir süreç ve çocukları tarafından değiştirilen (ya da okunan) dosyaları izlemek için . Strace ile karşılaştırıldığında, oldukça hızlı (;

Https://github.com/tycho-kirchner/shournal adresinde bulunabilir.

Kabuk üzerine örnek:

$ shournal -e sh -c 'echo hi > foo1; echo hi2 > foo2'
$ shournal -q --history 1
  # ...
  Written file(s):                                                                                                                                                                              
 /tmp/foo1 (3 bytes) Hash: 15349503233279147316                                                                                                                                             
 /tmp/foo2 (4 bytes) Hash: 2770363686119514911    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.