Ruby - 分叉进程上的 set_trace_func

Posted

技术标签:

【中文标题】Ruby - 分叉进程上的 set_trace_func【英文标题】:Ruby - set_trace_func on forked processes 【发布时间】:2015-12-09 14:31:43 【问题描述】:

我想实现以下目标:

构建一个 Ruby 命令行实用程序,它注册一些 set_trace_func 事件,然后调用您传递给它的任何 ruby​​ 可执行参数(比如rspec)。注册的事件然后转移到调用的命令。

myutility的伪代码:

set_trace_func() # Set some events here

exec(ARGV.join(' ')) # Execute argument passed

然后调用myutility rspec

我的目标实际上是在任意命令上注册跟踪点(只要它们使用 ruby​​ 垫片)。

我尝试过的事情:

    exec 不起作用,原因很明显(它完全取代了该过程)。 popen,系统,反引号。这些启动了一个独立的过程。

我可以使用某种形式的 IPC,但前提是可以控制我正在使用我的实用程序调用的命令。不是这种情况;我想接受任意 Ruby 可执行参数。

这可能吗?我没有仔细研究过的一件事是 drb,但这也假设了对外部论点的一些干扰。

【问题讨论】:

【参考方案1】:

您可以通过向 ruby​​ 解释器添加参数来将一些代码注入 ruby​​ 进程,因此您的实用程序可以分为两部分 - 运行程序和有效负载。 Payload 只是另一个脚本,它根据需要注册set_trace_func 等,然后运行器将前者注入目标脚本,如下所示:

exec('/usr/bin/env', 'ruby', '-r', payload_full_filename, *ARGV)

这将使 ruby​​ 到 require 您的有效负载首先进入进程,然后继续运行目标脚本本身(即使目标脚本无法编译,有效负载也会运行)

【讨论】:

太棒了。我正在从命令行执行 ruby​​ -r ;不知道 exec 允许这样做。这是正确的答案。一个快速跟进的问题:如何使用本身调用 ruby​​ 的命令来完成这项工作?像 rspec。就目前而言,它通过一个错误说它自然找不到 rspec。 我记得 - rspec 默认情况下不调用 ruby​​,但可以在 drb 上工作,您也可以运行spring-ed 可执行文件 至于“未找到”错误 - 因为在没有 shell 的情况下运行,您必须自己解析脚本完整路径(或通过传递给 which before/in runner) 您说“[rspec] 可以在 drb 上工作”,您的意思是什么?当我无权访问客户端代码时,如何让客户端(我传递给脚本的命令)在 drb 上工作? a 意味着 rspec 可以(并且在大型项目中可能)与 spork (github.com/sporkrb/spork) 一起使用,它通过预加载内容和分叉来加速测试启动,它可以在 drb 上运行,并且可能对您的工具来说是个问题,因为繁重的工作是在其他过程中完成的

以上是关于Ruby - 分叉进程上的 set_trace_func的主要内容,如果未能解决你的问题,请参考以下文章

ruby 等待所有分叉的子进程完成

Windows XP上的Git sh.exe进程分叉问题,慢吗?

ruby 在Ruby中尝试使用分叉和unix套接字

如何减少分叉进程以运行可执行文件的 Web 服务器的内存使用量?

分叉的子进程是不是使用相同的信号量?

为啥在并行子进程之间分叉两次后 pipe() 不工作?