2011-05-10 15 views
11

Tengo que ejecutar un comando en el fondo pero quiero tener el escape adecuado para su parámetro.Ejecutando comando de shell en el fondo de ruby ​​con el argumento apropiado escapando

system("rake send_mails subject='#{params[:subject]}' 2> /dev/null 1> /dev/null &"); 

si escribo system("rake", "send_mails", params[:subject]) entonces yo no tengo "lugar" para los cambios de dirección y el signo &. Si no, no tengo escapado para el parámetro subject.

¿Cómo puedo resolver esto?

+0

No estoy seguro, pero ¿intentar anidar llamadas 'system'? Por ejemplo: 'sistema (sistema (" rake "," send_mails ", params [: subject]),"/dev/null 1>/dev/null & ")' – fl00r

+0

La llamada interna 'system()' se ejecuta luego el 'sistema()' externo falla sin ejecutar nada: 'TypeError: no se puede convertir verdadero en String' – Notinlist

Respuesta

19

En Ruby 1.9, trato Process.spawn:

# Spawn a new process and run the rake command 
pid = Process.spawn({"subject" => params[:subject]}, 
        "rake", "send_mails", 
        :out => 'dev/null', :err => 'dev/null') 

# Detach the spawned process 
Process.detach pid 
+0

El punto sería no esperar en absoluto. Tenemos que pasar al procesamiento de la próxima consulta web, ya que no lo mencioné. Pero ese es el punto en redirigir la salida a '/ dev/null' y ejecutar con' & '- para alcanzar el desacoplamiento completo. – Notinlist

+1

Luego use Process.detach después de haber engendrado el nuevo proceso. Editaré mi respuesta para incluir esto. –

+1

Agregando que 'Process.fork do ... end' está disponible y cercano a perfecto en 1.8.7. – Notinlist

Cuestiones relacionadas