Bir dosyayı silmiş olan işlemin pid'i nasıl bulunur?


13

VM geçişiyle ilgili bir proje üzerinde çalışıyorum. Bazen VM görüntüsü kaybolacak ve sadece suçlunun kim olduğunu bilmek istiyorum. Şüpheli süreçler üzerindeki sıkıntıyı denedim ama işe yaramadı.


Tek bir işlem yerine her işlemde bağlantıyı kaldır sistem çağrılarını izlemenin bir yolunu bulmayı umuyordum ama sanırım bunu yapmanın kolay bir yolu yok ...
Mohammad

Yanıtlar:



1

Bazı dosyaları açık olan bir işlemin PID'sini bulabilirsiniz lsof.

Dosya kapatılıp silindikten sonra bu bilgileri alamazsınız.

BTW. Bir dosyayı silmenin, dosyanın kendisinde değil, bulunduğu dizinde çalıştığını unutmayın.


Maalesef silmek için bir dosyayı açmaya gerek yoktur. En azından örneğin "strace rm some-file" çıktısı rm komutunun önce dosyayı açıp sildiğini göstermez. Bu yüzden sanırım lsof yardımcı olmuyor.
Mohammad

Cevabımın son cümlesini okuyun
vartec

1

Yukarıdaki cevaplar yaşlandığından sysdig ile bir alternatif önereyim . Görüntülemek Izin pidve namedosyayı silin süreçlerin /tmp/test. Önce dosyayı ile oluşturuyoruz touch /tmp/test. Sonra sysdigaşağıdaki filtreyle başlıyoruz :

$ sudo sysdig -p'%proc.pid,%proc.name' '(evt.type=unlinkat and (evt.arg.name=test or evt.arg.name=/tmp/test)) or (evt.type=unlink and evt.arg.path=/tmp/test)'

unlinkat(2)yol (ör. ) göreli olabiliyorsa bir orfiltre gerektirir . İşlemek için hem (ki çağrılar ) ve (çağıran onun GNU versiyonunda), filtre her iki syscalls aynı olmalıdır.evt.arg.nameunlinkunlink(2)rmunlinkat(2)

sysdigbir işlem dosyayı sildiğinde çalışıyor olmalıdır. Sonra bu tür komutları yürüttüğümüzde:

$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test

Böyle bir çıktı görüntüler:

11380,unlink
11407,rm
11662,rm

Filtreleme ve çıktı hakkında açıklama için lütfen sysdig kullanıcı kılavuzuna bakın .

Filtre oldukça uzun olduğu için bir keski yazmayı uygun buldum. Bir sysdigkomutla ilişkili lua betiğidir :

description = "displays processes that delete a file"
short_description = "spy file deletion"
category = "files"

args = 
{
    {
        name = "path", 
        description = "the path of the file to monitor", 
        argtype = "string"
    },
}

function on_set_arg(name, val)
    path = val
    return true
end

function on_init()
    local filename = path
    for i in string.gmatch(path, "[^/]+") do
        filename = i
    end
    chisel.set_event_formatter("%proc.pid\t%proc.name")
    chisel.set_filter(
        "(evt.type=unlinkat and (evt.arg.name=" .. path .. " or \
                             evt.arg.name=" .. filename .. ")) or \
     (evt.type=unlink and evt.arg.path=" .. path .. ")")
    return true
end

Yorum yapmaktan ve geliştirmekten çekinmeyin. Lua komut spy_deletes.luadosyasını bir dizinin içindeki bir dosyaya koyabilir sysdigve keskiyi kullanılabilir hale getirmek için bu dizinde yürütebilirsiniz . Yazarken şöyle sudo sysdig -clgöreceksiniz:

Category: files
---------------
spy_deletes         spy file deletion

Şimdi onu arayabilirsiniz:

$ sudo sysdig -c spy_deletes /tmp/test

Ve başka bir terminal türünde:

$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test

Çıktı verecektir:

16025   unlink
16033   unlink
16041   rm
16049   rm

unlinkatFiltre daha doğru ve sadece mutlak yolunu eşleşecek şekilde hak. Bu, geçirilen dizinin fd'sinin alınmasını gerektirir unlinkat(2).


Senin emrinde bir çıktı yok.
AB

Ben yazmaya olduğunu rm /tmp/testbaşka bir terminal. Cevabımı daha açık hale getirmek için düzenledim.
Greg Leclercq
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.