Làm thế nào để tìm pid của quá trình đã xóa một tập tin?


13

Tôi đang làm việc trên một dự án liên quan đến di chuyển VM. Đôi khi hình ảnh VM sẽ biến mất và tôi chỉ muốn biết ai là thủ phạm. Tôi đã cố gắng sải bước trên các quy trình đáng ngờ nhưng không có kết quả.


Tôi đã hy vọng tìm ra cách để theo dõi cuộc gọi hủy liên kết hệ thống trên mọi quy trình thay vì chỉ một nhưng tôi đoán không có cách nào dễ dàng để làm điều này ...
Mohammad

Câu trả lời:



1

Bạn có thể tìm ra PID của một quá trình, trong đó có một số tệp đang mở bằng cách sử dụng lsof.

Khi tệp được đóng và xóa, bạn không thể lấy thông tin đó.

BTW. Hãy nhớ rằng việc xóa một tệp đang hoạt động trên thư mục, không phải trên chính tệp đó.


Thật không may, không cần phải mở một tập tin để xóa nó. Ít nhất là ví dụ đầu ra "strace rm some-file" không hiển thị rằng lệnh rm trước tiên mở tệp và sau đó xóa nó. Vì vậy, tôi đoán lsof là không hữu ích.
Mohammad

Đọc câu cuối cùng trong câu trả lời của tôi
vartec

1

Hãy để tôi đề nghị một thay thế với sysdig vì các câu trả lời ở trên đang già đi. Hãy hiển thị pidnamecác quá trình xóa tệp /tmp/test. Đầu tiên chúng ta tạo tập tin với touch /tmp/test. Sau đó, chúng tôi bắt đầu sysdigvới bộ lọc sau:

$ 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)yêu cầu một orbộ lọc nếu đường dẫn (ví dụ evt.arg.name) có thể là tương đối . Để xử lý cả unlink(mà gọi unlink(2)) và rm(gọi unlinkat(2)trong phiên bản GNU), bộ lọc phải khớp với cả hai tòa nhà.

sysdigsẽ được chạy khi một quá trình xóa tập tin. Sau đó, khi chúng tôi thực hiện các lệnh như vậy:

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

Nó sẽ hiển thị một đầu ra như vậy:

11380,unlink
11407,rm
11662,rm

Vui lòng tham khảo hướng dẫn sử dụng sysdig để được giải thích về lọc và đầu ra.

Vì bộ lọc khá dài, tôi thấy thuận tiện khi viết một cái đục. Đó là một tập lệnh lua được liên kết với một sysdiglệnh:

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

Hãy bình luận và cải thiện nó. Bạn có thể đặt tập lệnh lua trong một spy_deletes.luatập tin bên trong một thư mục và thực thi sysdigtrong thư mục này để làm cho cái đục có sẵn. Khi gõ sudo sysdig -clbạn sẽ thấy nó như sau:

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

Bây giờ bạn có thể gọi nó:

$ sudo sysdig -c spy_deletes /tmp/test

Và trong một loại thiết bị đầu cuối khác:

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

Nó sẽ xuất ra:

16025   unlink
16033   unlink
16041   rm
16049   rm

Bộ unlinkatlọc sẽ xứng đáng chính xác hơn và chỉ phù hợp với đường dẫn tuyệt đối. Điều này sẽ yêu cầu lấy fd của thư mục được truyền tới unlinkat(2).


Tôi không có đầu ra với lệnh của bạn.
AB

Tôi đã gõ rm /tmp/testvào một thiết bị đầu cuối khác. Tôi chỉnh sửa câu trả lời của tôi để làm cho nó rõ ràng hơn.
Greg Leclercq
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.