如何理解通过 strace 在后台运行外部命令的跟踪输出

如何理解通过 strace 在后台运行外部命令的跟踪输出

在 Ubuntu 中,我date &在一个 pid 为 6913 的交互式 bash shell 中运行,同时通过 .trace 从另一个交互式 bash shell 中跟踪该 bash shell strace。在第二个 shell 中跟踪第一个 shell 6913 的输出是:

$ sudo strace -f -e trace=process -p 6913
Process 6913 attached
clone(Process 12931 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f457c05ca10) = 12931
[pid 12931] execve("/bin/date", ["date"], [/* 66 vars */]) = 0
[pid 12931] arch_prctl(ARCH_SET_FS, 0x7f530c5ee740) = 0
[pid 12931] exit_group(0)               = ?
[pid 12931] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=12931, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG|WSTOPPED|WCONTINUED, NULL) = 12931
wait4(-1, 0x7ffea6780718, WNOHANG|WSTOPPED|WCONTINUED, NULL) = -1 ECHILD (No child processes)

bash shell 6913clone() 创建子进程 12931。

然后子进程12931execve() date并退出。

问题:

  • 据说在后台运行命令会使该命令在原始 shell 的子 shell 中运行。这是否意味着子 shell(此处为 12931)应该运行该命令,就像原始 shell 6913 直接运行该命令(请参阅下面的跟踪输出)一样?

  • clone()如果是,为什么 12931本身和它的克隆没有 execve() date? (实际上12931execve() date直接不带clone()本身)


当运行date而不是 时date &,跟踪 bash shell 的输出:

$ sudo strace -f -e trace=process -p 6913
[sudo] password for t: 
Process 6913 attached
clone(Process 12918 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f457c05ca10) = 12918
[pid  6913] wait4(-1,  <unfinished ...>
[pid 12918] execve("/bin/date", ["date"], [/* 66 vars */]) = 0
[pid 12918] arch_prctl(ARCH_SET_FS, 0x7ff00c632740) = 0
[pid 12918] exit_group(0)               = ?
[pid 12918] +++ exited with 0 +++
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WSTOPPED|WCONTINUED, NULL) = 12918
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=12918, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffea6781518, WNOHANG|WSTOPPED|WCONTINUED, NULL) = -1 ECHILD (No child processes)

基本上我想知道命令如何在后台、 bash 中-c以及直接在 bash shell 中以execve()和 的形式运行clone()

相关内容