通过pid支撑,包括儿童过程

时间:2015-03-11 07:28:17

标签: linux fork strace

我是新手,我想要分叉一个分叉的孩子。因为我想以普通用户身份执行此操作,所以我希望通过其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

有什么建议吗?

2 个答案:

答案 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范围检查。