我是新手,我想要分叉一个分叉的孩子。因为我想以普通用户身份执行此操作,所以我希望通过其pid进行扫描的进程需要是跟踪进程(strace)的子进程,所以我需要fork两次。在bash:
( ( sleep 1; echo "I'm echoed from a child of strace" )& exec strace -p $! )
#the sleep is for giving strace time to attach itself
这一切都有效,但我想跟踪跟踪过程的孩子,一旦我将-f
开关添加到strace,我就会收到错误:
( ( sleep 1; echo "I'm echoed from a child of strace" )& exec strace -fp $! )
#=> strace: attach: ptrace(PTRACE_ATTACH, ...): No such process
有什么建议吗?
答案 0 :(得分:0)
您可以跟踪自己用户的所有流程,而不仅仅是strace
的孩子。
关于您遇到的问题,您可以按如下方式重写命令:
strace -f bash -c 'sleep 1; echo "Im echoed from a child of strace"'
答案 1 :(得分:0)
问题在于您不需要exec
,例如:
( ( sleep 3; sleep 10 & sleep 20 & sleep 30 )& strace -fp $! )
你会看到你确实得到了所有子进程的结果:
...
[pid 166] wait4(-1, <unfinished ...>
[pid 174] <... nanosleep resumed> NULL) = 0
[pid 174] close(1) = 0
[pid 174] close(2) = 0
[pid 174] exit_group(0) = ?
[pid 174] +++ exited with 0 +++
[pid 166] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 174
[pid 166] wait4(-1, <unfinished ...>
[pid 175] <... nanosleep resumed> NULL) = 0
[pid 175] close(1) = 0
[pid 175] close(2) = 0
...
ps axf
输出(使用不同的PID):
202 ? S 0:00 \_ bash
203 ? S 0:00 | \_ bash
210 ? S 0:00 | | \_ sleep 10
211 ? S 0:00 | | \_ sleep 20
212 ? S 0:00 | | \_ sleep 30
204 ? S 0:00 | \_ strace -fp 203
在Ubuntu 14.04上测试,对没有特殊权限的用户进行了测试,并启用了ptrace范围检查。