2012-03-28 2 views
4

Ich möchte viele verschiedene Sinatra-Apps von einer zentralen (Sinatra) App aus steuern.Töte einen Child-Prozess, der sich von der Shell gelöst hat

Das Problem, das ich habe, ist egal, auf welche Weise ich exec/spawn/fork den Anruf, um es zu starten, kann ich nicht die PID des Sinatra-Servers, so dass ich töten kann (: int) es?

Dies ist aufgrund meiner Shell Exec String, die zuerst ein paar andere Befehle enthält, so bekomme ich die PID der ersten. Meine Befehlszeichenfolge ist wie

command = source ~/.profile; rbenv #{ver}; some_env=1234 ruby app.rb 

Also ich die pid des sh Prozess des Sourcing-Befehl erhalten.

Die Frage ist, wie kann ich die PID des oben gestarteten Ruby-Befehls bekommen?

Ich benutze derzeit Spawn, aber habe die meisten anderen auch ausprobiert, aber ich glaube nicht, dass das das Problem ist !?

pid = Process.spawn(command) 
pid # => 1234 

Der Rubin App selbst beginnt

$ ps aux 
1234 sh -c . ~/.profile; shell_script 
4567 shell_script 

ich 4567 wissen wollen !?

Antwort

0

Es gibt keinen einfachen Weg, Ihre '4567' zu bekommen, aber Sie sollten in der Lage sein, Ihren Prozess die gleiche pid wie Process.spawn zurückzukehren.

Versuchen Sie Ihren Befehl mit einem exec anstatt einer geraden Gespräch beenden ruby, das heißt:

source ~/.profile; rbenv #{ver}; export some_env=1234; exec ruby app.rb 
0

Sie können prüfen, ob der Prozess „shell_script“ ist ein Kind von „sh -c ~/.profile. ; shell_script ". Sie können dies über den Befehl" ps -axgf "überprüfen.

Wenn es ein Elternteil ist, dann können Sie die Gruppen-ID von pid 1234 verwenden (um die Ausgabe von ps -axgf zu erhalten), um das Kind mit pid 4567 mit diesem Befehl zu töten.

Kill -9 -1234 (Assumming 1234 ist die Gruppen-ID)

Verwandte Themen