2015-12-09 5 views
7

私は次のことを達成したいと思います:ルビー - フォークプロセスのset_trace_func

は、いくつかのset_trace_funcイベントを登録するRubyのコマンドラインユーティリティを構築するには、その後、あなたは(rspec言う)に渡すものは何でもルビー実行可能な引数を呼び出します。登録されたイベントは、呼び出されたコマンドに引き継がれます。

myutilityの擬似コード:

set_trace_func() # Set some events here 

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

その後myutility rspecとして呼び出します。

実際のところ、は、任意のコマンド(ルビーシムを使用している限り)にトレースポイントを登録します。私が試してみました

もの:

  1. execは明白な理由(それは完全にプロセスを置き換える)ため、動作しません。
  2. popen、system、backticks。これらは独立したプロセスを開始します。

私はIPCの何らかの形を使うことができますが、私は自分のユーティリティで起動しているコマンドを制御しています。これはそうではありません;任意のRuby実行可能引数を受け入れたいと思います。

これは可能ですか?私が密接に見ていないことの1つはdrbですが、それも外部の議論との干渉を前提としています。

答えて

0

ruby​​インタープリタに引数を追加することで、Rubyプロセスにコードを注入することができます。そのため、ユーティリティはrunnerとpayloadの2つの部分に分割できます。ペイロードは、それが必要に応じset_trace_funcなどに登録し、ちょうど別のスクリプトで、ランナーはそうのような目的のスクリプトに元を注入:

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

これは、最初のプロセスにrequireにあなたのペイロードをルビーを行いますし、その後ターゲットを実行しているに進みますスクリプト自体(ターゲットスクリプトがコンパイルできなくてもペイロードは実行されます)

+0

素晴らしいです。私はコマンドラインからruby -rを実行していました。 execがこれを許可したのを知らなかった。これは正解です。 1つの簡単なフォローアップの質問:どのように私はルビーを呼び出すコマンドでこの作業を行うことができますか? rspecのように。今のところそれは誤りで、それは自然にrspecを見つけることができないと言っています。 –

+0

私が覚えているように、rspecはデフォルトではrubyを起動しませんが、drbで動くことができます。また、 'spring'-ed実行可能ファイルに' – Vasfed

+0

'を実行できます。あなた自身がスクリプトをフルパスで(またはランナーの前/後に)渡して – Vasfed