2011-01-04 15 views
13

Ich benutze einen Scheduler (Rufus Scheduler) um jede Minute einen Prozess namens "ar_sendmail" (von ARmailer) zu starten.Wie kann ich nach einem laufenden Prozess mit Ruby suchen?

Der Prozess sollte NICHT gestartet werden, wenn bereits ein solcher Prozess läuft, um keinen Speicher zu verbrauchen.

Wie überprüfe ich, ob dieser Prozess bereits läuft? Was geht nach der unless unten?

scheduler = Rufus::Scheduler.start_new 

    scheduler.every '1m' do 

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

    end 

end 

Antwort

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

Dank! 1 Frage zurück: Warum die Klammern um das "l" von "ar_sendmail"? – TomDogg

+8

ist es, den aufrufenden Prozess von der grep für einen Prozess zu entfernen, der ar_sendmail entspricht - sonst würden Sie ein Ergebnis für 'grep ar_sendmail' erhalten – stef

+0

Muchas gracias, señor! – TomDogg

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

Ich denke, das ist eine viel bessere Lösung, da Sie nicht die Klammer-Sache verwenden müssen, um den aufrufenden Prozess auszuschließen. – while

+0

EDIT: Benötigte die Trennung auf \ n wegen der Rückgabestruktur von Pgrep. – dahlberg

Verwandte Themen