这个问题与“当我们在 shell 上输入一个简单的命令时会发生什么?”的问题我之前发过帖子。 (我认为单独发布会更好。但如果没有,请告诉我。)
我从中学到了上一个问题shell 内置命令经过特殊处理,普通外部命令在子进程上执行。
这次,我想跟踪 fork、clone 或 execve 等系统调用,以监视输入命令后实际发生的情况。但当我这样execve("bin/ls",,,) = 0
执行时,我只能跟踪 execve 调用。strace
strace -etrace=execve,clone ls
正如我猜测的那样,这意味着我只能监视创建子进程后调用的系统调用。
要监视与创建新进程相关的所有系统调用,我必须做什么?在这种情况下,用bash -c
like调用命令strace -etrace=execve,clone bash -c '{ ls; }'
会有帮助吗?
答案1
正如其中一篇中提到的答案对于您之前的问题,exec
家庭调用是在创建子进程之后发生的,因此如果您希望它出现在输出中,strace
那么您必须使其也跟随您正在跟踪的 shell 进程的子进程。
您可以通过添加-f
或-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
专门跟踪进程管理中涉及的所有调用。另外,还需要第二个无操作命令(:
),就像您仅使用单个命令运行 bash 一样,它足够聪明,可以只执行execve
而不分叉,因为它知道不需要执行任何其他操作。