wie kann ich ein Python-Skript weiter ausführen, wenn ich Putty schließe?

wie kann ich ein Python-Skript weiter ausführen, wenn ich Putty schließe?

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:

  1. 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.outsofern Sie sie nicht umleiten ( nohup pythonScript.py > outfile).

  2. 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 und tmux attacherneut 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 attacherneut aus und Sie sind wieder dort, wo Sie begonnen haben.

Antwort2

DerscreenDas für alle Linux-Distributionen verfügbare Tool unterstützt dies.

Um es zu installieren, führen Sie es apt-get install screenfür deb-basierte Linux-Distributionen oder dnf install -y screenfür yum install -y screenRPM-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 systemdProzesse beim Abmelden. Einige Versionen systemdbeenden 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=und KillExcludeUsers=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-lingerin loginctl(1).

Beachten Sie, dass diese Einstellung Tools wie (1) und (1) KillUserProcesses=yesbeschädigt , sofern sie nicht aus dem Sitzungsbereich verschoben werden. Siehe Beispiel in (1).screentmuxsystemd-run

Lesen Sie die verlinkte Antwort, um mehr zu erfahren.

verwandte Informationen