Frage

Ich habe eine lange laufenden Prozess und ich brauche es einen anderen Prozess zu starten (das wird während auch für einen guten Lauf). Ich muss sie nur beginnen und dann über sie völlig vergessen.

ich es geschafft, zu tun, was ich brauchte, um einen Code aus der Programmierung in Ruby Buch schöpft, aber ich möchte die beste / richtigen Weg zu finden und zu verstehen, was los ist. Hier ist, was ich bekam zunächst:

exec("whatever --take-very-long") if fork.nil?
Process.detach($$)


Also, das ist die Art und Weise, oder wie sonst soll ich es tun?

Nachdem die Antworten überprüften unten ich mit diesem Code am Ende, was mehr Sinn zu machen scheint:

(pid = fork) ? Process.detach(pid) : exec("foo")


würde ich eine Erklärung darüber, wie fork Werke zu schätzen wissen. [Bekam, dass bereits]

Wurde Abnehmen $$ richtig? Ich weiß nicht, warum das funktioniert, und ich würde wirklich lieben, ein besseres Verständnis für die Situation zu haben.

War es hilfreich?

Lösung

Die fork Funktion trennt Ihren Prozess in zwei Teile.

Beide Prozesse dann das Ergebnis der Funktion erhalten. Das Kind erhält einen Wert von Null / nil (und daher weiß, dass es das Kind ist) und die Mutter empfängt die PID des Kindes.

Daraus folgt:

exec("something") if fork.nil?

wird das Kind Prozessstart „etwas“ machen, und der übergeordnete Prozess wird weiter mit, wo es war.

Beachten Sie, dass exec() ersetzt der aktuelle Prozess mit "etwas", so wird das Kind Prozess ausführt nie nachfolgenden Ruby-Code.

Der Aufruf von Process.detach() sieht aus wie es falsch sein könnte. Ich würde es erwartet hätte das Kind PID in ihm haben, aber wenn ich den Code richtig gelesen es tatsächlich ist Abnehmen des übergeordneten Prozess.

Andere Tipps

Alnitak ist richtig. Hier ist ein deutlicher Weg, es zu schreiben, ohne $$

pid = Process.fork
if pid.nil? then
  # In child
  exec "whatever --take-very-long"
else
  # In parent
  Process.detach(pid)
end

Der Zweck detach ist nur zu sagen: „Ich interessiere mich nicht, wenn das Kind beendet“ Zombie-Prozesse .

Abnehmen $$ war nicht richtig. Von p. 348 der Pickaxe (2. Auflage):

  

$$ Fixnum Die Prozessnummer des Programms ausgeführt wird. [R / o]

In diesem Abschnitt „Variablen und Konstanten“ in der „Ruby-Sprache“ Kapitel, ist sehr praktisch, verschiedene Rubin kurze $ Konstanten zur Decodierung - aber die Online-Ausgabe (die erste

Also, was Sie tatsächlich tun, um das Programm von selbst abgenommen, nicht von ihrem Kind. Wie andere gesagt haben, ist der richtige Weg, von dem Kind lösen des Kindes pid von fork() zurück verwenden.

Die anderen Antworten sind gut, wenn Sie sicher sind, dass Sie das Kind Prozess trennen möchten. Wenn Sie jedoch entweder nichts ausmachen, oder würden es vorziehen, das Kind Prozess angebracht zu halten (zum Beispiel Sie Sub-Server / Dienste für einen Web-App starten), dann können Sie die Vorteile der folgende Kurzschreibweise nehmen

fork do
    exec('whatever --option-flag')
end

einen Block Providing sagt Gabel diesen Block (und nur diesen Block) in dem untergeordneten Prozess auszuführen, während in den übergeordneten auf der Fortsetzung.

fand ich die Antworten oben brach meinen Terminal und die Ausgabe vermasselte. das ist die Lösung, die ich gefunden.

   system("nohup ./test.sh &")

nur falls jemand das gleiche Problem hat, war mein Ziel in einen SSH-Server anmelden und dann diesen Prozess weiterlaufen auf unbestimmte Zeit. so test.sh ist dies

#!/usr/bin/expect -f
spawn ssh host -l admin -i cloudkey  
expect "pass"
send "superpass\r"
sleep 1000000
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top