Je suis sur le point d'exécuter un script python sur Ubuntu sur VPS. C'est un processus de formation en apprentissage automatique, alors prenez beaucoup de temps pour vous entraîner. Comment puis-je fermer le mastic sans arrêter ce processus.
19
nohup
.Réponses:
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: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
nouveau, vous vous retrouverez exactement dans la même session. La commande sera toujours en cours d'exécution (elle continuera de fonctionner lorsque vous vous déconnecterez) et vous pourrez voir ses stdout et stderr comme si vous ne vous étiez jamais déconnecté:Une fois que vous avez lancé cela, fermez simplement la fenêtre PuTTY. Ensuite, reconnectez-vous le lendemain, courez à
tmux attach
nouveau et vous êtes de retour là où vous avez commencé.la source
disown
2.screen
byobu
un wrapper autour de tmux ou d'un écran.L'
screen
outil, disponible pour toutes les distributions Linux, prend en charge cela.Pour l'installer, exécutez
apt-get install screen
pour les distributions Linux basées sur debdnf install -y screen
ouyum install -y screen
pour celles basées 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+ Apuis 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 Fox l'a mentionné, l'écran fonctionne mal avec systemd, mais nous pouvons utiliser systemd pour démarrer le script, comme on dit dans l'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
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 source
screen
cela ne fonctionne pas exactement avecsystemd
sa configuration par défaut. Je ne sais pas si Ubuntu utilisesystemd
, mais le comportement et la solution de contournement méritent d'être mentionnés dans votre réponseLa plupart des processus peuvent être trompés en redirigeant son stdout, stderr, stdin (tous les descripteurs ne sont pas toujours nécessaires pour rediriger) et en utilisant l'
&
opérateur de contrôle.Voir qui
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 dans cette réponse tue les
systemd
processus à la déconnexion. Certaines versions dessystemd
processus de suppression à 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
:Lisez la réponse liée pour en savoir plus.
la source
isatty()
et se ferme-t-il s'il ne l'est pas?"