Prozesse mit Kindern in ScreenSession transferien

karloff

karloff

Routinier
Moin,

ich hab mal ne Allg. Frage ob das überhaupt geht.

Allg kann man ja einzelne Processe von einem terminal in ein anderes packen.
(reptyr)

Allerdings geht das nur mit einem Prozess, sobald dieser Kinder hat geht es leider nicht mehr.

Daher die Frage kann man es irgendwie Bewerkstelligen einen ganzen laufenden Job incl. seiner childs in ein neues Terminal zu transferien?

Mir passiert es nämlich eindeutig zu oft das ich vergesse, das ganze dann in einer screen zu starten, weil ich ja demnächst los will und zwei rechner anhaben ist dann doch irgendwie uncool wenns nicht sein muss.

danke
 
Also ein Prozess ist erstmal grundsätzlich nicht an ein Terminal gebunden.
Der Prozess selbst weis nicht (unbedingt), in welchem Terminal oder Terminalemulator er läuft.
Ein (UNIX-) Prozess weis nur, dass er ggf. Daten über die stdin rein bekommt und schreibt selbst seine Ausgaben in die stdout resp. stderr.
Was an diese Standarddatenströme angeschlossen ist, kann je nach Umgebung variieren. Es ist in deinem fall wohl ein Terminal.
Wenn du zur Laufzeit des Prozesses seine Standarddatenströme umleiten willst, so kannst du das über den Umweg mit named Pipes oder - noch eleganter - mit Sockets machen.
 
Moin
Also ein einzelner laufden Process, z.B. ääähm ... thunderbird wenn es via terminal gestartet wurde.

Dann könnte ich den process erstmal mit
ctrl+z
Stoppen ,dann via
disown -h $PID
ihn von der Shell (parent) trennen
Eine neue Shell (screen) öffnen
und dann via
reptyr $PID
den process innerhalb der shell ihr zuweisen.

Das klappt eigentlich ganz gut

Das konkrete Anwendungsbeispiel hier wäre, ne SSH Shell auf nen Server, dort habe ich ein update gestartet ... das script welches ich mir dafür geschrieben hab
spawn jetzt kindsprocesse z.B. gcc welches das kompilieren des updates übernimmt.
Das Update script spawn im schnitt so 6-8 kinder.
Bis dahin alles okay, aber denn merk ich das ich los muss oder sowas .... jetzt hab ich das problem dass das update auf dem server nicht in ner screen session läuft, ergo der process stirbt sobald ich die ssh zum process trennen.

Daher die Frage ob es hier andere Möglichkeiten gibt (die auch irgendwie praktikabel sind) abgesehen von alles noch mal in der screen neu starten oder beide rechner anlassen.


Wenns nicht geht ist es auch kein Beinbruch, wäre nur irgendwie cool wenns gehen würde.
 
Wie oben bereits gesagt:
Häng dein Skript beim Start an named Pipes oder Sockets.
Das ist nicht schwierig.
Hier ein Beispiel aus einem meiner Programme (letzte Zeile!):
https://github.com/conqp/minectl/blob/master/src/bin/mcsrv

Oder dur überlegst dir vorher, ob du Zeit hast, auf das Skript zu warten und startest es mit nohup.
 
Zuletzt bearbeitet von einem Moderator:
Dein Skript hängt ziemlich sicher an einer Shell oder einem Interpreter und wenn du diese in eine Screen-Session verlegst anstelle deines Update-Skripts, dann sollten auch alle vom Skript geforkten Prozesse im Kontext dieser Screen-Session laufen.
 
Zurück
Oben