
Ich bin dabei, ein Python-Skript auf Ubuntu auf VPS auszuführen. Es handelt sich um einen maschinellen Lernprozess, daher dauert das Training sehr lange. Wie kann ich Putty schließen, ohne diesen Prozess zu stoppen?
Antwort1
Sie haben im Wesentlichen zwei Möglichkeiten:
Führen Sie den Befehl mit aus
nohup
. Dadurch wird die Verknüpfung mit Ihrer Sitzung aufgehoben und die Ausführung wird nach der Trennung fortgesetzt:nohup pythonScript.py
Beachten Sie, dass die Standardausgabe des Befehls an eine Datei namens angehängt wird,
nohup.out
sofern Sie sie nicht umleiten (nohup pythonScript.py > outfile
).Verwenden Sie einen Bildschirmmultiplexer wie
tmux
. Damit können Sie die Verbindung zum Remotecomputer trennen, aber wenn Sie das nächste Mal eine Verbindung herstellen undtmux attach
erneut ausführen, befinden Sie sich in genau derselben Sitzung. Der Befehl wird weiterhin ausgeführt (er wird auch dann ausgeführt, wenn Sie sich abmelden) und Sie können seine Standardausgabe und Standardfehler sehen, als hätten Sie sich nie abgemeldet:tmux pythonScript.py
Sobald Sie es gestartet haben, schließen Sie einfach das PuTTY-Fenster. Stellen Sie dann am nächsten Tag erneut eine Verbindung her, führen Sie es
tmux attach
erneut aus und Sie sind wieder dort, wo Sie begonnen haben.
Antwort2
Derscreen
Das für alle Linux-Distributionen verfügbare Tool unterstützt dies.
Um es zu installieren, führen Sie es apt-get install screen
für deb-basierte Linux-Distributionen oder
dnf install -y screen
für yum install -y screen
RPM-basierte aus.
Benutzen:
$ screen
Eine neue Shell wird gestartet. In dieser Shell können Sie Ihr Python-Skript starten. Dann können Sie Ctrl+ Shift+ Aund dann drücken D. Dadurch wird Ihr Terminal von der Shell getrennt, in der Ihr Skript ausgeführt wird. Darüber hinaus wird das Skript weiterhin darin ausgeführt.
Um zu sehen, wie Ihr Skript ausgeführt wird, können Sie aufrufen screen -r
. Dadurch wird Ihr Terminal wieder mit der Shell verbunden, in der das Python-Skript im Hintergrund ausgeführt wurde.
UPD: wie Fox erwähnte, funktioniert screen schlecht mit systemd, aber wir können systemd verwenden, um das Skript zu starten, wie es inoffizielles Beispiel.
Wenn Ihr Skript beispielsweise von gestartet wird /usr/bin/myPythonScript
, können Sie eine Systemd-Unit-Datei wie diese erstellen.
$ cat /etc/systemd/system/myPythonScript.service
[Unit]
Description=MyPythonScript
[Service]
ExecStart=/usr/bin/myPythonScript
[Install]
WantedBy=multi-user.target
Dann können Sie dieses Skript starten
# systemctl daemon-reload
# systemctl start myPythonScript
Wenn Sie möchten, dass dieses Skript beim Systemstart automatisch gestartet wird -
# systemctl enable myPythonScript
Sie können jederzeit sehen, wie Ihr Skript ausgeführt wird
# systemctl status myPythonScript
Anzeige Sie können die Protokolle Ihres Skripts einsehen
# journalctl -u myPythonScript -e
Antwort3
Die meisten Prozesse können durch die Umleitung von stdout, stderr und stdin (eine Umleitung aller Deskriptoren ist nicht immer erforderlich) und die Verwendung &
eines Steueroperators ausgetrickst werden.
Sehen Sie, das ping example.com 1>/dev/null &
funktioniert.
Natürlich sind einige Programme anspruchsvoller und erfordern solche Lösungen, wie sie @terdon erwähnt hat, aber es ist gut zu wissen und zu verwenden, was am besten passt.
EDIT: wie geschrieben indiese Antwortbeendet systemd
Prozesse beim Abmelden. Einige Versionen systemd
beenden Prozesse beim Abmelden standardmäßig, andere nicht. Dieses Verhalten kann geändert werden, indem Sie /etc/systemd/logind.conf ändern und die folgende Option festlegen. Wie geschrieben, kann dies auch einige Probleme lösen, die Sie möglicherweise mit den Lösungen von @terdon haben.
aus man logind.conf
:
KillUserProcesses=
Akzeptiert ein Boolean-Argument. Konfiguriert, ob die Prozesse eines Benutzers beendet werden sollen, wenn sich der Benutzer abmeldet. Wenn wahr, wird die der Sitzung entsprechende Bereichseinheit und alle Prozesse innerhalb dieses Bereichs beendet. Wenn falsch, wird der Bereich „aufgegeben“, siehe systemd.scope(5), und Prozesse werden nicht beendet. Standardmäßig „ja“, aber siehe die Optionen
KillOnlyUsers=
undKillExcludeUsers=
weiter unten.Zusätzlich zu den Sitzungsprozessen können Benutzerprozesse unter der Benutzermanagereinheit ausgeführt werden.[email geschützt]. Abhängig von den Linger-Einstellungen können Benutzer hierdurch möglicherweise Prozesse unabhängig von ihren Anmeldesitzungen ausführen. Siehe die Beschreibung
enable-linger
inloginctl
(1).Beachten Sie, dass diese Einstellung Tools wie (1) und (1)
KillUserProcesses=yes
beschädigt , sofern sie nicht aus dem Sitzungsbereich verschoben werden. Siehe Beispiel in (1).screen
tmux
systemd-run
Lesen Sie die verlinkte Antwort, um mehr zu erfahren.