프로그램에서 액세스하는 파일 나열

프로그램에서 액세스하는 파일 나열

time특정 명령이 소비하는 CPU 시간을 계산하려는 경우 이는 훌륭한 명령입니다.

나는 프로그램과 그 서브루틴이 액세스하는 파일을 나열할 수 있는 비슷한 것을 찾고 있습니다. 실시간 또는 사후 보고.

현재 나는 다음을 사용합니다:

#!/bin/bash

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

그러나 실행하려는 명령이 다음과 관련된 경우에는 sudo그다지 똑똑하지 않습니다(기존 파일이나 권한 문제가 있는 파일만 나열하거나 읽은 파일과 쓴 파일로 그룹화할 수 있다면 좋을 것입니다). 그리고 strace꽤 느리기 때문에 더 빠른 옵션이 있으면 좋을 것 같습니다.

답변1

나는 포기하고 나만의 도구를 작성했습니다. 해당 문서를 인용하면 다음과 같습니다.

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://codeberg.org/tange/tangetools/src/branch/master/tracefile

답변2

추적 시스템 호출을 사용할 수 있지만 strace속도 저하가 불가피합니다. strace높은 권한으로 명령을 실행하는 경우 루트로 실행해야 합니다.

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

잠재적으로 더 빠른 또 다른 접근 방식은 파일 시스템 액세스 기능이 포함된 라이브러리를 미리 로드하는 것입니다. 환경 LD_PRELOAD=/path/to/libmywrapper.so mycommand변수 LD_PRELOAD는 높은 권한으로 호출되는 프로그램에 전달되지 않습니다. 이 래퍼 라이브러리에 대한 코드를 작성해야 합니다(이것은 "재미와 이익을 위한 라이브러리 삽입기 구축"의 예입니다.); 웹에 재사용 가능한 코드가 있는지 모르겠습니다.

특정 디렉터리 계층 구조의 파일을 모니터링하는 경우 다음을 사용하여 파일 시스템 보기를 생성할 수 있습니다.로깅 파일 시스템이렇게 하면 뷰를 통한 모든 액세스가 기록됩니다.

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

LoggedFS를 구성하려면 프로그램에 포함된 샘플 구성으로 시작하여 읽어보세요.LoggedFS 구성 파일 구문.

또 다른 가능성은 리눅스이다감사 하위 시스템. 데몬이 시작되었는지 확인한 auditd다음 기록할 내용을 구성하세요.auditctl. 기록된 모든 작업은 기록됩니다 /var/log/audit/audit.log(일반적인 배포판에서). 특정 파일 시청을 시작하려면:

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

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

답변3

나는 당신이 lsof를 원한다고 생각합니다(아마도 프로그램과 그 하위 항목에 대해 grep으로 연결될 것입니다). 현재 액세스 중인 파일 시스템의 모든 파일을 알려줍니다. 프로세스가 액세스하는 파일에 대한 정보(여기에서):

lsof -n -p `pidof your_app`

답변4

아마도 충분한 제어권을 제공하지는 못하지만(아직?), 저는 Linux 커널의 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    

관련 정보