프로그램이 액세스 한 파일 나열


64

time 주어진 명령에 걸리는 CPU 시간을 알아 내려면 훌륭한 명령입니다.

프로그램과 그 자식이 액세스하는 파일을 나열 할 수있는 비슷한 것을 찾고 있습니다. 실시간으로 또는 나중에 보고서로 사용할 수 있습니다.

현재 나는 사용합니다 :

#!/bin/bash

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

그러나 실행할 명령이 관련되면 실패합니다 sudo. 매우 지능적이지는 않습니다 (기존 파일이나 권한 문제가 있거나 읽은 파일과 쓰여진 파일로 파일을 그룹화 할 수 있다면 좋을 것입니다). 또한 strace느리므로 더 빠른 선택으로 좋을 것입니다.


의 사용을 고려할 때 strace특히 Linux에 관심이 있다고 가정합니다. 옳은?
Gilles

리눅스는 저의 주요 관심사입니다.
Ole Tange

답변:


51

나는 내 자신의 도구를 포기하고 코딩했다. 문서에서 인용하려면 :

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

파일 만 출력하므로의 출력을 처리 할 필요가 없습니다 strace.

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


감사! strace의 출력은 절대 읽을 수 없습니다. 문서를 어디에서 찾을 수 있는지 모르겠습니다. -h /-help 옵션이 있으면 좋을 것입니다. 또한 파일 편집 만 표시하고 액세스는 표시하지 않는 옵션에 감사합니다.
Xerus

@Xerus Clone gitlab.com/ole.tange/tangetools 를 실행하십시오 make && sudo make install. 그런 다음을 실행할 수 있습니다 man tracefile.
Ole Tange

4
좋은 도구입니다. 그것을 포장, 설치 : yum -y install https://extras.getpagespeed.com/release-el7-latest.rpmyum -y install tracefile
다닐라 Vershinin

27

로 시스템 호출을 추적 할 수 strace있지만 실제로 불가피한 속도 저하가 있습니다. strace명령이 상승 된 권한으로 실행되는 경우 루트 로 실행해야합니다 .

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

더 빠른 다른 방법은 파일 시스템 액세스 기능을 둘러싼 라이브러리를 미리로드하는 것입니다 LD_PRELOAD=/path/to/libmywrapper.so mycommand. LD_PRELOAD환경 변수는 상승 된 권한으로 호출 프로그램에 전달되지 않습니다. 해당 랩퍼 라이브러리의 코드를 작성해야합니다 ( “재미와 이익을위한 라이브러리 인터 포저 빌드”의 예 ). 웹에 재사용 가능한 코드가 있는지 모르겠습니다.

특정 디렉토리 계층에서 파일을 모니터링하는 경우 해당보기를 통한 모든 액세스가 기록되도록 LoggedFS 를 사용하여 파일 시스템 을 볼 수 있습니다.

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

LoggedFS를 구성하려면 프로그램과 함께 제공된 샘플 구성으로 시작하고 LoggedFS 구성 파일 구문을 읽으 십시오 .

또 다른 가능성은 Linux의 감사 서브 시스템 입니다. auditd데몬이 시작 되었는지 확인한 다음로 로그 할 대상을 구성하십시오 auditctl. 기록 된 각 작업은 /var/log/audit/audit.log(일반 배포시)에 기록됩니다 . 특정 파일 시청을 시작하려면

auditctl -a exit,always -w /path/to/file

디렉토리에 감시를두면 디렉토리에있는 파일과 그 하위 디렉토리도 반복적으로 감시됩니다. 감사 로그가 포함 된 디렉토리를 보지 않도록주의하십시오. 로깅을 특정 프로세스로 제한 할 수 있습니다 auditctl. 사용 가능한 필터에 대한 매뉴얼 페이지를 참조하십시오 . 감사 시스템을 사용하려면 루트 권한이 있어야합니다.


LD_PRELOAD정적 바이너리에서는 작동하지 않습니다.
David 주어진

6

나는 당신이 lsof를 원한다고 생각합니다. 현재 파일 시스템에서 액세스중인 모든 파일을 알려줍니다. 프로세스 에서 액세스 한 파일에 대한 정보 ( 여기에서 ) :

lsof -n -p `pidof your_app`

11
그러나 그것은 나에게 스냅 샷을 제공합니다. 내가 필요한 것은 어떤 파일에 액세스하려고했는지입니다. "파일 누락"이라고 표시되어 프로그램 시작을 거부하는 상황을 생각해보십시오. 어떤 파일을 찾고 있었는지 어떻게 알 수 있습니까?
Ole Tange

2

나는 그것을 시도했다 tracefile. 나를 위해 그것은 내 자신보다 훨씬 적은 일치를 주었다 strace ... | sed ... | sort -u. 난 추가 -s256strace(1)행을 명령하지만 많은 도움이되지 않았다 ...

그런 다음 시도했습니다 loggedfs. 먼저 로그를 시도한 디렉토리에 대한 읽기 / 쓰기 액세스 권한이 없기 때문에 실패했습니다. chmod 755를 일시적으로 수행 한 후 몇 가지 히트를 얻었습니다 ...

그러나 나를 위해 다음을 수행하는 것이 가장 효과적입니다.

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

그런 다음 관심있는 프로세스를 실행 한 후 출력을 후 처리하십시오.

이것은 추적 된 디렉토리 의 파일 프로세스 액세스 아웃을 포착하지 못 하거나 다른 프로세스가 동일한 디렉토리 트리에 액세스했는지 여부를 알지 못하지만 대부분의 경우 작업을 수행하기에 충분한 도구입니다.

편집 : inotifywait는 symlink 액세스를 포착하지 않습니다 (symlink가 해결 된 후 대상 만). 나중에 사용하기 위해 프로그램에서 액세스 한 라이브러리를 보관할 때이 문제가 발생했습니다. 여분의 perl glob hackery를 사용하여 통지 된 라이브러리를 따라 심볼릭 링크를 선택하여 특정 경우에 작업을 수행했습니다.

EDIT2 적어도 파일 inotifywait를 명령 행 (예 : 행 심볼릭 링크 자체 inotifying 때 inotifywait -m file symlink또는 inotifywait symlink file하나 (이 관계없이 명령 라인에 먼저 액세스되는 표시한다) 출력 filesymlink액세스된다). inotifywait는 IN_DONT_FOLLOW를 지원하지 않습니다. 프로그래밍 방식으로 시도했을 때 file명령 줄의 순서에 관계없이 액세스를 볼 수 있습니다 (예상하거나 기대하지 않을 수도 있습니다 ...)


"나를 위해 저보다 훨씬 적은 수의 일치를주었습니다" tracefile파일 액세스 가 누락 된 예를 공유 할 수 있습니까 ?
올레 탱

정확히 무엇을 묻고 있는지 잘 모르겠습니다 :) ... / path / to / traced / directory / 내부에서 파일을 찾으려고하면 inotify 출력에 OPEN이 표시됩니다 ...하지만 stat (1) 파일을 보는 내가 시도한 몇 가지 사례에서 결과를 얻지 못했습니다 (왜, 일부 캐싱이 디렉토리 내용 읽기를 숨기고 있는지 궁금합니다)
Tomi Ollila

아래의 fanotify 게시물에 댓글을 달고 있습니다 (10 년 이상을 설명했지만 명성은 21 명뿐입니다. 코멘트에 50을 요구하면 항상 저에게 장애물이되었습니다 ...)-fanotify는 좋은 물건이지만, 할 수는 없습니다 심볼릭 링크 역 참조 문제를 해결하십시오 (예 : 심볼릭 링크의 경우 액세스 한 최종 파일은 / proc / self / fd / <fd>을 읽음으로써 찾을 수 있습니다. 어쨌든 +1 : 답변 : D
Tomi Ollila

1

충분한 제어를 제공하지는 못하지만 (아직?) 나는 특정 프로세스와 그 자식에 의해 수정되거나 읽은 파일 만 모니터링하기 위해 linux-kernel의 fanotify 및 unshare를 사용하여 적어도 부분적으로 요구를 충족시키는 프로그램을 작성했습니다. . strace와 비교하면 상당히 빠릅니다 (;

https://github.com/tycho-kirchner/shournal 에서 찾을 수 있습니다

쉘의 예 :

$ 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    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.