web-dev-qa-db-fra.com

comment garder un script python en cours d'exécution lorsque je ferme le mastic

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.

19
chickensoup

Vous avez deux choix principaux:

  1. 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).

  2. 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é.

38
terdon

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

2
vodolaz095

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= et KillExcludeUsers= 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 dans loginctl (1).

Notez que le paramètre KillUserProcesses=yes cassera des outils comme screen (1) et tmux (1), à moins qu'ils ne soient déplacés hors de la portée de la session. Voir l'exemple dans systemd-run(1).

Lisez la réponse liée pour en savoir plus.

1
styrofoam fly