2015-12-09 17 views
7

mi piacerebbe raggiungere i seguenti obiettivi:Rubino - set_trace_func sui processi biforcuta

Costruire una linea di comando di Ruby che registra alcuni eventi set_trace_func, poi invoca qualunque argomento rubino eseguibile si passa ad esso (diciamo rspec). Gli eventi registrati vengono quindi trasferiti al comando invocato.

pseudo codice di myutility:

set_trace_func() # Set some events here 

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

quindi chiamare come myutility rspec.

Il mio obiettivo qui è quello di registrare effettivamente i punti di traccia sui comandi arbitrari (a condizione che utilizzino gli spessori di rubino).

cose che ho provato:

  1. exec non funziona, per ovvie ragioni (che sostituisce il processo del tutto).
  2. popen, sistema, backtick. Questi iniziano un processo indipendente.

Posso usare qualche forma di IPC, ma questo assume il controllo sul comando che sto invocando con la mia utilità. Questo non è il caso; Mi piacerebbe accettare arbitrariamente argomenti eseguibili su Ruby.

È possibile? Una cosa che non ho guardato da vicino è drb, ma anche questo presuppone un'interferenza con argomenti esterni.

risposta

0

È possibile inserire codice nel processo Ruby aggiungendo argomenti all'interprete Ruby, in modo che l'utilità possa essere suddivisa in due parti: runner e payload. Payload è solo un altro script, si registra per set_trace_func ecc su di richiedere, e corridore iniettare della prima nella sceneggiatura bersaglio in questo modo:

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

questo renderà rubino al require vostro carico nel processo e poi procedere con l'esecuzione di destinazione script stesso (il carico utile verrà eseguito anche se lo script di destinazione non può essere compilato)

+0

Impressionante. Stavo facendo ruby ​​-r dalla riga di comando; non sapevo che exec lo permettesse. Questa è la risposta corretta. Una rapida domanda di follow-up: come posso farlo funzionare con comandi che invocano se stessi ruby? Come rspec. Così com'è ora attraverso un errore che dice che non può trovare rspec, naturalmente. –

+0

come ricordo - rspec non invoca il ruby ​​di default, ma può funzionare su un drb, inoltre puoi eseguire gli eseguibili 'spring'-ed – Vasfed

+0

come per l'errore 'non trovato' - perché l'esecuzione senza shell dovrai risolvere script full path (o passando a 'which' before/in runner) – Vasfed