ファイルを削除したプロセスのPIDを見つける方法は?


13

VMの移行に関連するプロジェクトに取り組んでいます。VMイメージが消える場合があり、犯人が誰かを知りたいだけです。疑わしいプロセスでstraceを試しましたが、役に立ちませんでした。


1つだけではなく、すべてのプロセスでリンク解除システムコールをトレースする方法を探していましたが、これを行う簡単な方法はないと思います
Mohammad

回答:



1

を使用していくつかのファイルを開いているプロセスのPIDを確認できますlsof

ファイルを閉じて削除すると、その情報を取得できなくなります。

ところで。ファイルの削除は、ファイル自体ではなく、そのディレクトリでの操作であることに注意してください。


残念ながら、削除するためにファイルを開く必要はありません。少なくとも、たとえば「strace rm some-file」の出力は、rmコマンドが最初にファイルを開いてから削除することを示しません。だから、lsofは役に立たないと思います。
モハンマド

私の答えの最後の文を読む
-vartec

1

上記の回答は古くなっているため、sysdigを使用した代替案を提案します。ファイルを削除するプロセスpidnameを表示してみましょう/tmp/test。まず、でファイルを作成しますtouch /tmp/test。次にsysdig、次のフィルターから始めます。

$ 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)パス(例)が相対的なor場合、フィルターが必要です。(を呼び出す)と(GNUバージョンを呼び出す)の両方を処理するには、フィルターは両方のsyscallに一致する必要があります。evt.arg.nameunlinkunlink(2)rmunlinkat(2)

sysdigプロセスがファイルを削除するときに実行されている必要があります。そのようなコマンドを実行すると:

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

次のような出力が表示されます。

11380,unlink
11407,rm
11662,rm

フィルタリングと出力の説明については、sysdigユーザーガイドを参照してください。

フィルターはかなり長いので、ノミを書くのが便利だと思いました。sysdigコマンドに関連付けられているluaスクリプトです。

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

コメントして改善してください。luaスクリプトはspy_deletes.luaディレクトリ内ファイルに配置し、sysdigこのディレクトリで実行して、チゼルを使用可能にすることができます。入力sudo sysdig -clすると、次のように表示されます。

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

今、あなたはそれを呼び出すことができます:

$ sudo sysdig -c spy_deletes /tmp/test

そして、別の端末タイプで:

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

出力されます:

16025   unlink
16033   unlink
16041   rm
16049   rm

unlinkatフィルタは、より正確であるとだけ絶対パスを一致させるために値するでしょう。これには、に渡されるディレクトリのfdを取得する必要がありますunlinkat(2)


あなたのコマンドには出力がありません。
AB

rm /tmp/test別の端末で入力していました。回答を編集してわかりやすくしました。
グレッグルクレール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.