it-swarm.com.de

Wie kann ich in Ruby überprüfen, ob ein Prozess mit einer bestimmten PID ausgeführt wird?

Wenn es mehrere Möglichkeiten gibt, listen Sie diese bitte auf. Ich kenne nur einen, aber ich frage mich, ob es einen saubereren In-Ruby-Weg gibt.

43
Pistos

Wenn es sich um einen Prozess handelt, von dem Sie erwarten, dass er "Eigentümer" ist (z. B. verwenden Sie dies zum Validieren einer PID für einen Prozess, den Sie steuern), können Sie einfach sig 0 an ihn senden.

>> Process.kill 0, 370
=> 1
>> Process.kill 0, 2
Errno::ESRCH: No such process
    from (irb):5:in `kill'
    from (irb):5
>> 
45
Dustin

Der Unterschied zwischen den Process.getpgid- und Process::kill-Ansätzen scheint zu sein, was passiert, wenn die PID vorhanden ist, aber einem anderen Benutzer gehört. Process.getpgid gibt eine Antwort zurück, Process::kill löst eine Ausnahme (Errno::EPERM) aus.

Darauf basierend empfehle ich Process.getpgid, nur weil Sie dadurch zwei verschiedene Ausnahmen ersparen müssen.

Hier ist der Code, den ich verwende:

begin
  Process.getpgid( pid )
  true
rescue Errno::ESRCH
  false
end
57
tonystubblebine

@John T, @Dustin: Tatsächlich, Leute, ich habe die Process-Dococs durchgesehen, und es sieht so aus 

Process.getpgid( pid )

ist ein weniger gewalttätiges Mittel, um dieselbe Technik anzuwenden.

45
Pistos

Bei untergeordneten Prozessen verhalten sich andere Lösungen wie das Senden eines Signals nicht wie erwartet: Sie geben an, dass der Prozess noch läuft, wenn er tatsächlich beendet wird.

Sie können Process.waitpid verwenden, wenn Sie einen Prozess überprüfen möchten, den Sie selbst erstellt haben. Der Aufruf wird nicht blockiert, wenn Sie das Flag Process::WNOHANG verwenden und nil zurückgegeben wird, solange der untergeordnete Prozess nicht beendet wurde.

Beispiel:

pid = Process.spawn('sleep 5')
Process.waitpid(pid, Process::WNOHANG) # => nil
sleep 5
Process.waitpid(pid, Process::WNOHANG) # => pid

Wenn die PID nicht zu einem untergeordneten Prozess gehört, wird eine Ausnahme ausgelöst (Errno::ECHILD: No child processes).

Gleiches gilt für Process.waitpid2 .

26
balu

So habe ich es gemacht:

def alive?(pid)
  !!Process.kill(0, pid) rescue false
end
5
komatsu

Unter Linux können Sie viele Attribute für die Ausführung des Programms mit dem proc-Dateisystem erhalten:

File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")
4
amenzhinsky

Sie können es mit versuchen

Process::kill 0, pid

wobei PID die PID-Nummer ist. Wenn die PID läuft, sollte sie 1 zurückgeben.

4
John T

Ein *nix- Ansatz wäre nur Shell-out zu ps und zu überprüfen, ob ein \n (neue Zeile) Trennzeichen in der zurückgegebenen Zeichenfolge vorhanden ist.

Beispiel IRB-Ausgabe

1.9.3p448 :067 > `ps -p 56718`                                                          
"  PID TTY           TIME CMD\n56718 ttys007    0:03.38 zeus slave: default_bundle   \n"

Als Methode verpackt

def process?(pid)  
  !!`ps -p #{pid.to_i}`["\n"]
end
0
Daniel Doezema

Ich habe mich schon früher mit diesem Problem befasst und gestern habe ich es in das " process_exists " gem kompiliert. 

Sie sendet das Nullsignal (0) mit der angegebenen PID an den Prozess, um zu prüfen, ob sie existiert. Es funktioniert auch, wenn der aktuelle Benutzer keine Berechtigung hat, das Signal an den Empfangsprozess zu senden.

Verwendungszweck:

require 'process_exists'

pid = 12
pid_exists = Process.exists?(pid)
0
Wilson Silva