Como entender a saída do rastreio executando um comando externo em segundo plano via strace

1

No Ubuntu, executo date & em um shell bash interativo cujo pid é 6913 e, ao mesmo tempo, rastreio o shell bash de outro shell bash interativo por strace . A saída do rastreamento do primeiro shell 6913 no segundo shell é:

$ 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)

A shell bash 6913 clone() para criar o subprocesso 12931.

Em seguida, o subprocesso 12931 execve() date e sai.

Perguntas:

  • Diz-se que a execução de um comando em segundo plano faz com que o comando seja executado em uma subcamada do shell original. Isso significa que o subshell (aqui 12931) deve executar o comando, da mesma forma que o O shell original 6913 executa o comando diretamente (veja abaixo sua saída de rastreamento)?

  • Se sim, porque não faz 12931 clone() em si e, em seguida, seu clone execve() date ? (na verdade, 12931 execve() date diretamente sem clone() em si)

Ao executar date em vez de date & , a saída do rastreamento do shell bash:

$ 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)

Basicamente, quero saber como um comando é executado em segundo plano, no bash -c e diretamente no bash shell em termos de execve() e clone() .

    
por Tim 03.03.2016 / 07:15

0 respostas