기존 프로세스, 특히 해당 매개변수(예: 환경 변수, cwd 디렉터리, stdout 등)를 추적하고 싶습니다. 나는 할 수 있다. 그러나 단기 프로세스에 대한 정보는 얻을 수 없습니다.) 예를 들어:
내가 실행하면 :
sleep 120 &
# get info from /proc/`pgrep sleep`
그것은 간단합니다.
하지만 내 프로세스가 즉시 종료되거나 프로세스의 PID를 모르는 경우(그러나 일부 프로세스가 생성될 것으로 예상되는 경우) 어떻게 해야 합니까?
답변1
일반 사용자의 한 가지 접근 방식은 exec
프로그램이 검색을 통해 실행된다고 가정하는 래퍼 입니다 PATH
. 즉, 귀하의 포장program
#!/bin/sh
env > /some/log/file
... (any other desired logging commands here) ...
exec /path/to/real/program "$@"
에 먼저 존재해야 하므로 기록하려는 실제 이름과 정확히 일치하는 이름의 래퍼를 PATH
가질 수 있으며 래퍼 내에서 래퍼를 원래 이름으로 바꿀 수 있습니다. 프로그램이 정규화된 경로를 통해 실행되는 경우 이와 유사한 것을 조정해야 할 수도 있고 관련 응용 프로그램이 경로를 변경하는 옵션을 제공할 수도 있습니다.PATH=/some/wrapper/dir:$PATH
program
program
program
program
exec
LD_PRELOAD
왜냐하면 (root
sysdig
다양한 sysdig 예ls
) 관심 있는 임시 프로세스 이름과 일치할 수 있고 프로그램이 특정 사용자로 실행되고 있다고 가정하면 관심 있는 항목으로 드릴다운할 수 있기 때문입니다 .
sudo sysdig "proc.name = ls and user.name = jhqdoe" | tee log
다소 긴 파일을 실행하면 log
필요한 거의 모든 것을 제공하는 항목이 표시됩니다(환경은 잘림).ls
execve
9734 16:12:49.683389228 1 ls (20542) < execve res=0 exe=ls args=--color=auto. tid=20542(ls) pid=20542(ls) ptid=20052(bash) cwd= fdlimit=1024 pgft_maj=0 pgft_min=61 vm_size=404 vm_rss=4 vm_swap=0 comm=ls cgroups=cpuset=/.cpu_cgroup=/.cpuacct=/.mem_cgroup=/.devices=/user.slice.freezer=/.ne... env=XDG_SESSION_ID...
통과하다사용자 설명서execve
및 기타 문서에서 위의 내용은 호출 및 표시의 전체 컨텍스트 까지 정확할 수 있습니다 .
sudo sysdig -p "%proc.env" "proc.name = ls and user.name = jhqdoe and evt.type = execve" | tee xxx
-p
원하는 내용을 표시하도록 조정하세요 . 끌을 사용하여 실시간 캡처나 저장된 파일 등에서 원하는 내용을 추출할 수도 있습니다.
답변2
당신은 사용해야합니다forkstat(1)
아니면 다른 프로그램을 사용하던가프로세스 커넥터상호 작용. 안타깝게도 이 작업은 루트로만 수행할 수 있습니다. 또한 확장 가능하거나 스크립트 가능하지 않으므로 프로세스 환경, 제어 tty 등도 인쇄하려면 forkstat(1)
proc 커넥터의 데이터와 proc 커넥터의 데이터를 결합하는 자체 프로그램을 작성해야 할 것입니다. 에서.procfs
forkstat(1)
다음은 바이너리의 실제 경로와 프로세스의 현재 디렉터리를 인쇄하는 매우 조잡한 "확장" 방법입니다 execve
.
stdbuf -o0 forkstat -e fork,exec | perl -anle '
print;
if($F[1] eq "exec"){
print "\texe = ", readlink "/proc/$F[2]/exe";
print "\tcwd = ", readlink "/proc/$F[2]/cwd";
}
'
일반 사용자로서 유일한 해결책은 다음을 통해 이러한 단기 프로세스(또는 해당 상위 프로세스 중 하나)를 시작하는 상위 프로세스를 실행하는 것입니다.
strace -s1024 -vfe trace=execve prog args ...
이 -s
옵션은 인쇄할 argv 및 env 문자열 수를 제어합니다 strace
. 프로그램을 실행하면 strace
성능에 상당한 영향을 미칠 수 있습니다 . 보다 사용자 친화적이고 스크립트 가능한 다른 대안이 있을 수 있지만 strace(1)
일반 사용자가 사용하려면 모두 사용해야 하므로 근본적으로 다를 것이라고 기대하지 마십시오.ptrace(2)