Je suis sur le point d'exécuter un script python sur Ubuntu sur VPS. Il s'agit d'un processus de formation par apprentissage automatique, alors prenez beaucoup de temps pour vous entraîner. Comment puis-je fermer PuTTY sans arrêter ce processus.
Vous avez deux choix principaux:
Exécutez la commande avec Nohup
. Cela le dissociera de votre session et le laissera continuer à fonctionner après votre déconnexion:
Nohup pythonScript.py
Notez que la sortie standard de la commande sera ajoutée à un fichier appelé Nohup.out
sauf si vous le redirigez (Nohup pythonScript.py > outfile
).
Utilisez un multiplexeur d'écran comme tmux
. Cela vous permettra de vous déconnecter de la machine distante, mais la prochaine fois que vous vous connecterez, si vous exécutez tmux attach
encore une fois, vous vous retrouverez exactement dans la même session. La commande sera toujours en cours d'exécution (elle continuera de s'exécuter lorsque vous vous déconnecterez) et vous pourrez voir ses stdout et stderr comme si vous ne vous étiez jamais déconnecté:
tmux
pythonScript.py
Une fois que vous avez lancé cela, fermez simplement la fenêtre PuTTY. Ensuite, reconnectez-vous le lendemain, exécutez tmux attach
encore une fois et vous êtes de retour là où vous avez commencé.
L'outil screen
, disponible pour toutes les distributions Linux, le prend en charge.
Pour l'installer, exécutez apt-get install screen
pour les distributions Linux basées sur deb, ou dnf install -y screen
ou yum install -y screen
pour ceux basés sur RPM.
Utiliser:
$ screen
Un nouveau Shell est lancé. Dans ce Shell, vous pouvez démarrer votre script Python. Ensuite, vous pouvez appuyer sur Ctrl+Shift+A puis D. Il détachera votre terminal du Shell qui exécute votre script. De plus, le script est toujours en cours d'exécution.
Pour voir comment fonctionne votre script, vous pouvez appeler screen -r
. Cela rattachera votre terminal au Shell avec le script Python que vous avez laissé en cours d'exécution en arrière-plan.
UPD: comme l'a mentionné Fox, screen fonctionne mal avec systemd, mais nous pouvons utiliser systemd pour démarrer le script, comme on dit dans exemple officiel .
Par exemple, si votre script est démarré par /usr/bin/myPythonScript
, vous pouvez créer un fichier d'unité Systemd, comme ceci.
$ cat /etc/systemd/system/myPythonScript.service
[Unit]
Description=MyPythonScript
[Service]
ExecStart=/usr/bin/myPythonScript
[Install]
WantedBy=multi-user.target
Ensuite, vous pouvez démarrer ce script # systemctl daemon-reload
# systemctl start myPythonScript
Si vous voulez que ce script démarre automatiquement au démarrage du système -
# systemctl enable myPythonScript
À tout moment, vous pouvez voir comment votre script s'exécute
# systemctl status myPythonScript
Annonce que vous pouvez consulter les journaux de votre script
# journalctl -u myPythonScript -e
La plupart des processus peuvent être dupés en redirigeant ses stdout, stderr, stdin (tous les descripteurs ne sont pas toujours nécessaires pour rediriger) et en utilisant &
opérateur de commande.
Regarde ça ping example.com 1>/dev/null &
Fait le travail.
Bien sûr, certains programmes sont plus sophistiqués et nécessitent des solutions telles que @terdon mentionné, mais il est bon de savoir et d'utiliser ce qui convient le mieux.
EDIT: comme écrit en cette réponse tue systemd
processus à la déconnexion. Certaines versions de systemd
tuent les processus à la déconnexion par défaut, d'autres non. Ce comportement peut être modifié en modifiant /etc/systemd/logind.conf en définissant l'option suivante. Tel qu'il est écrit, cela peut également résoudre certains problèmes que vous pourriez rencontrer avec les solutions de @ terdon.
de man logind.conf
:
KillUserProcesses=
Prend un argument booléen. Configure si les processus d'un utilisateur doivent être arrêtés lorsque l'utilisateur se déconnecte. Si la valeur est true, l'unité d'étendue correspondant à la session et tous les processus à l'intérieur de cette étendue seront arrêtés. S'il est faux, la portée est "abandonnée", voir systemd.scope (5) et les processus ne sont pas supprimés. Par défaut, "oui", mais voir les options
KillOnlyUsers=
etKillExcludeUsers=
au dessous de.En plus des processus de session, le processus utilisateur peut s'exécuter sous l'unité de gestion des utilisateurs utilisateur @ .service. Selon les paramètres de persistance, cela peut permettre aux utilisateurs d'exécuter des processus indépendamment de leurs sessions de connexion. Voir la description de
enable-linger
dansloginctl
(1).Notez que le paramètre
KillUserProcesses=yes
cassera des outils commescreen
(1) ettmux
(1), à moins qu'ils ne soient déplacés hors de la portée de la session. Voir l'exemple danssystemd-run
(1).
Lisez la réponse liée pour en savoir plus.