如何记录Ant脚本随时间生成的所有子进程?

时间:2015-06-01 18:06:23

标签: bash ant child-process

我继承了一个传统的基于Ant的构建系统,我试图了解它的范围。我观察到多个jvmjunit任务fork=yes。它会疯狂地调用subant和类似的任务。有时,它只是exec的其他过程。

我真的不想为每项任务搜索100多个脚本和参考文档,以找到可能的分叉行为。我希望在构建运行时捕获子进程列表。

我设法为构建创建了一个干净的Vagrant + Puppet环境,我可以像这样运行完整版本

$ cd /vagrant && $ANT_HOME/bin/ant 

如果我不得不暴力破解......我会在构建过程中启动脚本并捕获子进程,直到构建完成为止?

#!/bin/bash

$ANT_HOME/bin/ant &
while ps $!
do
  sleep 1
  ps --ppid $! >> build_processes
done

2 个答案:

答案 0 :(得分:0)

由于ant是一个java进程,您可以尝试使用byteman。在byteman脚本中,您可以定义在执行exec的方法java.lang.Runtime时触发的规则。

使用ANT_OPTS env变量将byteman附加到ant。

答案 1 :(得分:0)

用户Jayan建议strace,具体为:

$ strace -f -e trace=fork ant

-f限制跟踪fork系统调用。

  

跟踪子进程,因为它们是由cur-创建的                      由于fork(2)而临时跟踪进程                      系统调用。新流程很快就会附上                      因为它的pid是已知的(通过返回值                      fork(2)在父进程中)。这意味着这样                      孩子们可能会失控一段时间(特此 -                      在vfork(2)的情况下,直到父母                      计划再次完成其(v)fork(2)调用。                      如果父进程决定等待(2)一个孩子                      目前正在追踪,它被暂停                      直到适当的子进程终止                      或者发出导致其终止的信号                      (根据孩子当前的信号确定                      位置)。

我找不到trace=fork表达式,但trace=process似乎很有用。

-e trace=process
  

跟踪涉及流程管理的所有系统调用。这对于查看进程的fork,wait和exec步骤非常有用。

http://linuxcommand.org/man_pages/strace1.html