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的主要内容,如果未能解决你的问题,请参考以下文章
Windows XP上的Git sh.exe进程分叉问题,慢吗?