strace를 통해 백그라운드에서 외부 명령을 실행하는 추적 출력을 이해하는 방법

strace를 통해 백그라운드에서 외부 명령을 실행하는 추적 출력을 이해하는 방법

우분투에서는 date &pid 6913을 사용하는 대화형 bash 쉘에서 실행 중이며, .trace를 통해 다른 대화형 bash 쉘에서 해당 bash 쉘을 추적하고 있습니다 strace. 두 번째 셸에서 첫 번째 셸 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 쉘 6913은 clone() 하위 프로세스 12931을 생성합니다.

그런 다음 하위 프로세스 12931이 execve() date종료됩니다.

질문:

  • 백그라운드에서 명령을 실행하면 해당 명령이 원래 쉘의 하위 쉘에서 실행된다고 합니다. 이것은 원래 쉘 6913이 명령을 직접 실행한 것처럼 하위 쉘(여기서는 12931)이 명령을 실행해야 한다는 것을 의미합니까(아래 추적 출력 참조)?

  • clone()그렇다면 12931 자체와 그 클론은 왜 안되나요 execve() date? (사실 12931은 자신을 execve() date포함하지 않습니다 clone())


date대신 실행 시 bash 셸의 출력을 추적합니다 date &.

$ 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에서, 그리고 -cbash 쉘에서 직접 실행할 수 있는 방법을 알고 싶습니다 .execve()clone()

관련 정보