이 질문은 다음과 관련이 있습니다."셸에 간단한 명령을 입력하면 어떻게 되나요?"라는 질문이 있습니다.이전에 포스팅한 적이 있습니다. (별도의 론칭이 더 좋을 것 같습니다. 하지만 그렇지 않다면 알려주세요.)
나는 그것으로부터 배웠다이전 질문쉘 내장 명령은 특별히 처리되며 일반 외부 명령은 하위 프로세스에서 실행됩니다.
이번에는 fork, clone, execve 등의 시스템 호출을 추적하여 명령이 입력된 후 실제로 어떤 일이 일어나는지 모니터링하고 싶습니다. 하지만 execve("bin/ls",,,) = 0
이렇게 실행하면 execve 호출만 추적할 수 있습니다.strace
strace -etrace=execve,clone ls
추측한 대로 이는 하위 프로세스가 생성된 후에 호출되는 시스템 호출만 모니터링할 수 있음을 의미합니다.
새 프로세스 생성과 관련된 모든 시스템 호출을 모니터링하려면 어떻게 해야 합니까? 이 경우 bash -c
유사한 도움말을 사용하여 명령을 호출 합니까 strace -etrace=execve,clone bash -c '{ ls; }'
?
답변1
중 하나에서 언급했듯이답변이전 질문의 경우 exec
홈 호출은 하위 프로세스가 생성된 후에 발생하므로 출력에 표시하려면 strace
추적 중인 셸 프로세스의 하위 프로세스도 따르도록 해야 합니다.
-f
or 옵션을 추가하여 -ff
이 작업을 수행 할 수 있습니다 . 다음은 관련 매뉴얼 페이지 조각입니다.
-f Trace child processes as they are created by currently traced processes as a
result of the fork(2) system call.
-ff If the -o filename option is in effect, each processes trace is written to
filename.pid where pid is the numeric process id of each process. This is
incompatible with -c, since no per-process counts are kept.
명령 실행과 관련된 관련 호출을 추적하려면 bash
다음을 수행할 수 있습니다.
strace -f -e trace=process bash -c 'ls; :'
-e trace=process
특히 프로세스 관리와 관련된 모든 호출을 추적합니다 . 또한 두 번째 no-op 명령( )이 필요합니다. 예를 들어 단일 명령으로 bash를 실행하는 경우 다른 작업을 수행할 필요가 없다는 것을 알기 때문에 분기 없이 :
실행해도 충분히 똑똑합니다 .execve