2011-01-04 13 views
13

Utilizo un programador (planificador Rufus) para iniciar un proceso llamado "ar_sendmail" (de ARmailer), cada minuto.¿Cómo verificar un proceso en ejecución con Ruby?

El proceso NO debe iniciarse cuando ya se está ejecutando dicho proceso para no consumir memoria.

¿Cómo verifico si este proceso ya se está ejecutando? ¿Qué sucede después del unless a continuación?

scheduler = Rufus::Scheduler.start_new 

    scheduler.every '1m' do 

    unless #[what goes here?] 
     fork { exec "ar_sendmail -o" } 
     Process.wait 
    end 

    end 

end 

Respuesta

23
unless `ps aux | grep ar_sendmai[l]` != "" 
+0

Gracias! 1 pregunta atrás: ¿Por qué los corchetes alrededor de la "l" de "ar_sendmail"? – TomDogg

+8

es para eliminar el proceso de llamada de grep para un proceso que coincida con ar_sendmail; de lo contrario, obtendría un resultado para 'grep ar_sendmail' – stef

+0

Muchas gracias, señor! – TomDogg

8
unless `pgrep -f ar_sendmail`.split("\n") != [Process.pid.to_s] 
+1

Creo que esta es una solución mucho mejor ya que no tiene que usar el corchete para excluir el proceso de llamada. – while

+0

EDITAR: Necesita la división en \ n debido a la estructura de retorno de pgrep. – dahlberg

Cuestiones relacionadas