파일을 삭제 한 프로세스의 pid를 찾는 방법은 무엇입니까?


13

VM 마이그레이션과 관련된 프로젝트를 진행 중입니다. 때로는 VM 이미지가 사라지고 범인이 누구인지 알고 싶습니다. 의심스러운 프로세스에서 strace를 시도했지만 아무 소용이 없습니다.


나는 단지 하나가 아닌 모든 프로세스에서 링크 해제 시스템 호출을 추적하는 방법을 찾고 있었지만, 이렇게하는 쉬운 방법이 없을 것 같다 ...
Mohammad

답변:



1

프로세스를 사용하여 파일을 연 프로세스의 PID를 찾을 수 있습니다 lsof.

파일이 닫히고 삭제되면 해당 정보를 얻을 수 없습니다.

BTW. 파일을 삭제하는 것은 파일 자체가 아니라 해당 디렉토리에있는 작업입니다.


불행히도 파일을 삭제하기 위해 파일을 열 필요가 없습니다. 예를 들어 "strace rm some-file"출력은 rm 명령이 먼저 파일을 연 다음 삭제한다는 것을 보여주지 않습니다. 그래서 lsof는 도움이되지 않는 것 같습니다.
Mohammad

내 답변의 마지막 문장을 읽으십시오
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다른 터미널 에 입력 하고 있었습니다 . 명확하게하기 위해 답변을 편집했습니다.
Greg Leclercq
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.