Hallo zusammen,
aktuell stehe ich vor einem kleinen Problem und ich weiß nicht genau wie
ich das in Python realisiere.
Ich habe bisher mein Python Skript immer mit "nohup test.py &" direkt in
Hintergrund getrennt von der Konsole gestartet.
Nun ist die Sache, dass ich gerne beim Start ein paar Eingaben mit input
abfragen möchte, das Programm dann einige Zeit laufen lassen und nach
ein paar Zyklen quasi den gleichen Zustand wie mit nohup erreichen
möchte.
Ist das direkt aus Python heraus möglich? Entweder ich suche falsch oder
das ist nicht so ein Anwendungsfall den man oft braucht.
Sollte ich hier vielleicht anders vorgehen? Eigentlich kann ich an der
Vorgehensweise nichts ändern, ich weiß nur nicht wie ich aus Python
heraus das Programm in den Hintergrund verschiebe (am besten ohne
unterbrechung) und es von dort vom Terminal löse, damit es nach dem
Logout weiter läuft.
Jemand Tipps?
Grüße Dennis
Ja nohup kann ich ja nur beim Start zu Beginn verwenden. Ein nohup -p
PID ist bei mir nicht auf dem System installiert.
Eine Klasse habe ich in Python nicht programmiert, es ist ein kleines
Skript welches ein paar Werte abfragt.
Ich glaube ich schaue mir screen einmal genauer an.
Dennis X. schrieb:> Ich glaube ich schaue mir screen einmal genauer an.
Einfach mal screen test.py starten, damit tun, was tu tun willst und
dann das Skript (bzw. die screeen-Session) mit Strg+a d vom Terminal
abkoppeln. Später kannst du dich per screen -R wieder damit verbinden,
bzw. wenn mehrere laufen mit screen -list eine Liste der laufenden
Sessions ausgeben lassen und mit screen -r <session-name> dann eine zum
verbinden auswählen.
Rolf M. schrieb:> Strg+a d
Die pid meines Prozesses hol ich mir gleich zu Beginn. Kann ich das dann
über ein kill -xyz ebenso realisieren? Würde da gerne direkt aus dem
Code machen.
Also so richtig funktioniert das alles noch nicht wie ich das möchte.
Ich würde gerne einmalig die Mainloop durchlaufen um dann das ganze in
den Hintergrund zu verschieben. Screen hört sich sehr interessant an,
aber wie geht das direkt aus Python heraus?
Gibt es noch andere Möglichkeiten?
machs doch einfach so daß das script sich selbst nochmal mit nohup
startet, und die ursprüngliche Instanz sich dann beendet. Gib alle
benötigten Daten aus dem ersten Teil der Ausführung über die
Kommandozeile an die neue Instanz so daß diese weiß daß und wo sie
weitermachen soll. So würde ich das machen, kurz und schmerzlos.
Dennis X. schrieb:> Screen hört sich sehr interessant an
tmux ist die aktuell empfohlene Weiterempfehlung davon, screen ist schon
etwas angestaubt, es gibt keinen Grund das heute noch zu verwenden.
tmux verwende ich gern wenn ich mich per ssh auf nen entfernten Rechner
einlogge, das ist so ziemlich das erste was ich in die Konsole tippe
nach dem login. Wenn ich dann grad 5 virtuelle Terminals mit
angefangener Arbeit oder laufenden Prozessen offen habe kann jederzeit
jemand über mein Netwerkkabel stolpern oder das Telefon klingelt und ich
muss weg, alles kein Problem. Später setz mich dann an irgend nen
anderen Rechner, verbinde mich wieder und mit tmux a finde ich alle
meine Terminals wieder exakt so vor wie ich sie verlassen habe,
inclusive laufender Prozesse. Feine Sache ist das.
Bernd K. schrieb:> machs doch einfach so daß das script sich selbst nochmal mit nohup> startet, und die ursprüngliche Instanz sich dann beendet. Gib alle> benötigten Daten aus dem ersten Teil der Ausführung über die> Kommandozeile an die neue Instanz so daß diese weiß daß und wo sie> weitermachen soll. So würde ich das machen, kurz und schmerzlos.
Wozu einen neuen Prozess starten, wenn man das mit dem Prozessmanagement
der Shell lösen kann? Und die meisten Terminalemulatoren sowie Bash,
Dash, zsh u, können mit dem SIGTSTP (tty stop) einen Prozess pausieren
und bieten dann mit Foreground ('fg') oder Background ('bg')
Möglichkeiten zur Steuerung an. Kannste auch kill dafür nehmen, wenns
denn sein muss: kill -TSTP <pid>
db8fs schrieb:> Wozu einen neuen Prozess starten, wenn man das mit dem Prozessmanagement> der Shell lösen kann?
Ich dachte er wills automatisieren, so daß es sich nach dem Start und
ein paar Fragen an den Benutzer automatisch in den Hintergrund
verabschiedet.
Bernd K. schrieb:> Ich dachte er wills automatisieren, so daß es sich nach dem Start und> ein paar Fragen an den Benutzer automatisch in den Hintergrund> verabschiedet.
Hmm, jo, könnte sein, aber aus den Antworten oben mit 'screen' hatte ich
eigentlich einen manuellen Eingriff seinerseits angenommen. D.h er
drückt aufn Knopf, lässt das Skript laufen und schickts dann, wenn er
gesehen hat, was er sehen wollte, einfach in den Hintergrund.
Mach ich bei den meisten Sachen so, und wenn's der Texteditor im
Vordergrund ist. Kurz in den Hintergrund, fix das Editierte kompiliert
und dann Editor wieder nach vorne geholt. Komplett ohne screen und co.
Wenn's vollautomatisiert laufen soll, dass das ganze im Vordergrund
anläuft und dann selber in den Hintergrund wechselt, würde ich das aber
dennoch lieber auf der Shellebene lösen wollen - das Pythonskript selber
sollte nicht sich selber steuern können, das geht schief (also
Parent-Prozess manipulieren). Und selbst Funktionen, die Teilprozesse
starten, würden andere Pythonskripte erfordern - man dreht sich also im
Kreis. Daher lieber per Shell.
db8fs schrieb:> Mach ich bei den meisten Sachen so, und wenn's der Texteditor im> Vordergrund ist. Kurz in den Hintergrund, fix das Editierte kompiliert> und dann Editor wieder nach vorne geholt. Komplett ohne screen und co.
Natürlich geht das. Nur ist das Programm halt weg, wenn du die Konsole
schließt, was ja hier ausdrücklich nicht passieren soll. Deshalb der
Tipp mit screen.
Screen ist toll. Ich muss auch nie wieder an diesen Prozess ran, weil ab
dann eine Server API die Steuerung darstellt. Daher eigentlich nur noch
die Frage wie kann ich aus python heraus eine aufterufenes Skript durch
"screen python skript.py" nach hinten schieben?
Rolf M. schrieb:> Deshalb der> Tipp mit screen.
lieber tmux empfehlen anstelle von screen im Jahre 2016. Das kann man
übrigens sogar von innen heraus komplett scripten, sein Python Script
könnte also rein theoretisch sich selbst in einer neuen tmux-Sitzung
starten, den interaktiven Teil erledigen und dann die tmux-Sitzung
detachen. Allerdings wäre das ein etwas unkonventionelles (um nicht zu
sagen extrem schräges) Verhalten, meist pflegt der tmux Nutzer gerne
selbst die Kontrolle behalten zu wollen und detached manuell wenn ihm
danach ist oder er erzeugt einfach schnell ein weiteres Fenster wenn
grad alle belegt sind.
Dennis X. schrieb:> Screen ist toll.
Vergiss es bevor Du zuviel Zeit investierst. Nimm stattdessen dessen
aktuellen Nachfolger tmux und lass das alte screen auf dem Friedhof
ruhen.
Bernd K. schrieb:> lieber tmux empfehlen anstelle von screen im Jahre 2016.
Die aktuelle stable-Version 4.4 von screen ist von Juni 2016.
Bernd K. schrieb:> Nimm stattdessen dessen aktuellen Nachfolger tmux und lass das alte> screen auf dem Friedhof ruhen.
Also auf der Webseite von screen steht nix von einem Nachfolger. tmux
hab ich noch nicht verwendet. Es scheint einfach nur eine Alternative,
aber nicht der "aktuelle Nachfolger" von screen zu sein.
Bernd K. schrieb:> Vergiss es bevor Du zuviel Zeit investierst. Nimm stattdessen dessen> aktuellen Nachfolger tmux und lass das alte screen auf dem Friedhof> ruhen.
Danke Bernd,
ich habe mich ein wenig in tmux eingelesen und finde es echt toll! Mach
das jetzt auch bei jeder SSH Session als erstes, sofern installiert.
Eine Frage bleibt auch nach überfliegen der Doku noch.
Ich hab im einen Terminal tmux laufen und befinde mich hier in einem
Programm. Durch eine andere Shell würde ich nun gerne Fenster 1 wieder
auf den eigentlichen SSH screen bringen und tmux einfach nach hinten
schieben.
Geht das? Wenn ja, wäre mein Problem gelöst!
Grüße