Laufendes Programm in tmux session einhängen

Sloop

Well-Known Member
Hallo,

obwohl das nicht unbedingt FreeBSD "only" related ist, wüßte ich keine bessere Alternative wohin ich das posten sollte. Da ich FreeBSD nutze schreibe ich es in dieses Forum hinein. Bitte entschuldigt falls das falsch war, und bitte an entsprechende Stelle "verschieben" (an die Admins).

Zu meiner Frage:

angenommen da läuft auf meiner Shell irgendein Arbeitsvorgang der sehr lange dauert (nehmen wir an ich baue mir grad 'nen Desktop-Manager, inklusive X und Firefox, und weiß der Kukuck :-) ). Kann ich denn so eine laufende "stinknormale" shell irgendwie auf tmux verschieben? tmux war bisher nicht gestartet, keine tmux session aktiv. Ich möchte jetzt erst an diesem Punkt quasi eine tmux session starten, und den laufenden Prozess xyz dahin verschieben. So daß ich mich von diesem Computer abmelden kann, und mich von einem ganz anderen entfernten Computer wieder einlogge um mit "tmux attach" weiterzuarbeiten und den Fortschrittstand einzusehen.

Geht das irgendwie? Mit STRG-Z und fg wirds ja auch nicht viel bringen, oder? Freue mich auf eure Tips
 
Ich habe mal ein Programm für Linux gesehen, was eine Session nach screen überführt. Das ist eine ziemliche "hackerische" Sache was da passiert. Da wird intern recht viel umgebogen. Also "einfach so", wird das wohl nicht gehen.
 
Genau. Jedes Programm wird beim Start an ein Terminal gebunden. Diese Bindung ist endgültig. Terminalmultiplexer wie tmux und screen funktionieren grob gesagt so, dass sie nach unten selbst in einem Terminal laufen und nach oben hin eines zur Verfügung stellen. Beim Detach trennen sie sich vom unteren Terminal, beim Attach greifen sie es wieder.

Nun gibt es da einen ganz dreckigen Hack, um die Terminalbindung zu umgehen: Hijacke den Zielprozess, zwinge ihn das Terminal freizugeben und binde ihn dann an einen anderen. Man kann es mit gdb machen, aber nunja... Für Linux gibt es ein Tool, was das Ganze automatisiert: http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/ Für FreeBSD ist mir nichts bekannt, aber die Sache ist auch so eklig, dass man ihr aus dem Weg gehen möchte.

Ein möglicher Work-Around ist das nur wenig bekannte Stasi-Tool watch(8) mit dem man in laufende Terminals schauen kann. Aber dafür muss das Zielterminal geöffnet bleiben und man darf sich dort nicht ausloggen. Ein anderer Weg ist das Bash-Kommando "disown", mit dem man ein beim Start vergessenes "nohup" nachträglich ausführen kann. Leider hat die tcsh meines Wissens kein Equivalent dazu.
 
Aber wird der Prozess dann nicht noch immer mit SIGHUP abgeschossen, sobald der Nutzer das Terminal schließt?
 
Zuletzt bearbeitet:
denke ich auch. Ich kann ja auch über ein andres Terminal ein mit bg geschicktes Programm nicht einfach mit fg wieder zurückholen. Mag zwar die gleiche uid sein, die genutzt wird, aber das geht definitiv nicht.
 
Kann man es eigentlich so biegen, dass man nach einem login direkt in einer screen Instanz sitzt. Und falls ja, spricht irgendwas dagegen, dass nicht zu machen?
 
Okay, das wusste ich nicht. Ich dachte immer, es haut dann raus. Wieder was gelernt :)
 
Kann man es eigentlich so biegen, dass man nach einem login direkt in einer screen Instanz sitzt. Und falls ja, spricht irgendwas dagegen, dass nicht zu machen?

Auf meinen Server verbinde ich mich immer mit ssh und starte dort automatisch mit einem kleinen Script ähnlich dem Folgenden:

#!/usr/bin/perl

@offeneSessions = `tmux ls`;
if ($#offeneSessions >= 0){
$offeneSession =~ s/^([^:]*).*/$1/;
exec "tmux attach -t $offeneSession";
}
else {
exec "tmux new -s std";
}
 
Nein, der läuft weiter.

Ich hatte das dann wohl missverstanden. Ich hatte mein Antwort darauf bezogen: wenn man an einer shell angemeldet ist und irgendeinen Prozess mit STRG+Z in den bg schickt, und man loggt sich dann aus dieser Shell wieder aus, oder die Shell wurde sonstwie unterbrochen/beendet dann ist natürlich dieser background-Prozess auch weg. Das ist ja nur ein fork unterhalb der Login-Shell gewesen. Deshalb meinte ich auch "die ist dann weg" :ugly:

@Rakor: nice 1. Tmux bietet von Haus aus schon eine Möglichkeit an, bestehende Sessionpräsenz zu überprüfen. Das geht mit has-sessions und liefert nen errorlevel zurück (null oder eins).

Hier ein kleines Beispiel für 'ne (Bash-)Shell:

Code:
SESSION=$USER
tmux has-session -t $SESSION
if [ $? -eq 0 ]; then
    echo "Es existiert eine tmux-Session für $SESSION. Haeng dich jetzt da dran ..."
    sleep 2
    tmux attach -t $SESSION
    exit 0;
fi
 
# Wenn keine session vorhanden ist, erstellen wir eine neue mit dem Namen $USER
# und dabei detachen wir diese gleich
tmux new-session -d -s $SESSION

Grüße,
Sloop.
 
Zurück
Oben