我继承了一个传统的基于Ant的构建系统,我试图了解它的范围。我观察到多个jvm
和junit
任务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
答案 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步骤非常有用。