straceを介してバックグラウンドで外部コマンドを実行するトレース出力を理解する方法

straceを介してバックグラウンドで外部コマンドを実行するトレース出力を理解する方法

Ubuntuはdate &pid 6913を使用して対話型bashシェルで実行されており、.traceを介して他の対話型bashシェルでそのbashシェルを追跡していますstrace。 2番目のシェルで最初のシェル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()

ベストアンサー1

おすすめ記事