it-swarm-tr.com

Bir program tarafından erişilen dosyaları listeleyin

time, verilen bir komutun ne kadar CPU süresi gerektirdiğini anlamak istiyorsanız parlak bir komuttur.

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

Şu anda kullanıyorum:

#!/bin/bash

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

ancak çalıştırılacak komut Sudo içeriyorsa başarısız olur. Çok zeki değil (yalnızca mevcut dosyaları listeleyen veya izin sorunları olan veya bunları okunan dosyalara ve yazılmış dosyalara ayırabilseydi iyi olurdu). Ayrıca strace yavaştır, bu nedenle daha hızlı bir seçimde iyi olur.

65
Ole Tange

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ı çıktılar, böylece strace çıktısıyla uğraşmanıza gerek kalmaz.

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

56
Ole Tange

Sistem çağrılarını strace ile izleyebilirsiniz, ancak gerçekten kaçınılmaz bir hız cezası vardır. Komut yükseltilmiş ayrıcalıklarla çalışıyorsa strace kökünü çalıştırmanız gerekir:

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

Daha hızlı olması muhtemel bir başka yöntem de, dosya sistemi erişim işlevlerini saran bir kitaplığı önceden yüklemektir: LD_PRELOAD=/path/to/libmywrapper.so mycommand. LD_PRELOAD ortam değişkeni, yükseltilmiş ayrıcalıklarla çağrılan programlara aktarılmaz. Bu paketleyici kütüphanesinin kodunu yazmanız gerekir ( "Eğlence ve kâr için kütüphane aracıları oluşturma" ); Web üzerinde yeniden kullanılabilir kod olup olmadığını bilmiyorum.

Belirli bir dizin hiyerarşisindeki dosyaları izliyorsanız, LoggedFS ile dosya sistemini, bu görünüm üzerinden tüm erişimlerin günlüğe kaydedileceği şekilde görüntüleyebilirsiniz. .

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

LoggedFS'yi yapılandırmak için, programla birlikte verilen ö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 . auditd arka plan programının başlatıldığından emin olun, ardından neyi kaydetmek istediğinizi yapılandırın auditctl . Kaydedilen her işlem /var/log/audit/audit.log (tipik dağılımlarda). 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 özyinelemeli olarak izlenir. Denetim günlüklerini içeren dizini izlememeye dikkat edin. Günlüğe kaydetmeyi belirli işlemlerle sınırlandırabilirsiniz, kullanılabilir filtreler için auditctl man sayfasına bakın. Denetim sistemini kullanmak için kök olmanız gerekir.

Bence sen lsof istiyorum (muhtemelen programda bir grep boru ve çocukları). Dosya sisteminde şu anda erişilen her dosyayı size söyleyecektir. İşlemle hangi dosyalara erişildiği hakkında bilgi için ( buradan ):

lsof -n -p `pidof your_app`
7
unclejamil

Bunu denedim tracefile. Benim için kendi strace ... | sed ... | sort -u 'Dan daha az eşleşme verdi. strace(1) komut satırına -s256 Bile ekledim ama pek yardımcı olmadı ...

Sonra loggedfs denedim. İlk ben onunla oturum açmaya çalıştığım dizine okuma/yazma erişimi yoktu çünkü başarısız oldu. chmod 755 geçici olarak yaptıktan sonra bazı hit aldım ...

Ancak, benim için aşağıdakileri yapmak en iyi sonucu verir:

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

Ve sonra ilgilenilen işlemi çalıştırdıktan sonra çıktıyı işleyin.

Bu, izlenen dizin dosya işlem erişim çıkışını yakalamaz veya bu başka bir işlemin aynı dizin ağacına erişip erişmediğini bilmez, ancak çoğu durumda bu işi almak için yeterince iyi bir araçtır yapılır.

EDIT: inotifywait sembolik erişim yakalamaz (sadece sembolik bağlantıların çözüldükten sonraki hedefler). İleride kullanmak üzere bir program tarafından erişilen kütüphaneleri arşivlediğimde buna çarpmıştım. Belirli bir durumda işi yapmak için bildirilen kütüphanelerdeki sembolik bağlantıları almak için bazı ekstra Perl glob hackery'lerini kullandı.

EDIT2: en azından dosyaları inotify ve inotifywait komut satırından kendilerini sembolik bağlar (örneğin inotifywait -m file symlink Veya inotifywait symlink file) Çıktısı komut satırında hangisinin ilk olduğuna erişim gösterir (hangisi olursa olsun, file/symlink erişildi). inotifywait, IN_DONT_FOLLOW'u desteklemez - ki, programlı olarak denediğimde, komut satırındaki sıraya bakılmaksızın file 'e (bu, ya da beklemiyor olabilir ...) erişimi görür.

2
Tomi Ollila

Size yeterince kontrol vermese de (henüz?) Linux-kernel'in sadece belirli bir işlem ve çocukları tarafından değiştirilen (veya okunan) dosyaları izlemek için fanotify ve paylaşımını kullanarak, en azından kısmen ihtiyaçlarınızı karşılayan bir program yazdım. . Strace ile karşılaştırıldığında, oldukça hızlıdır (;

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

Kabuk Örneği:

$ 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    
1
spawn