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