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.
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.
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:
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
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é:
tmux
pythonScript.py
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é.
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 deb
dnf install -y screen
ou yum 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
[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
screen
cela ne fonctionne pas exactement avec systemd
sa configuration par défaut. Je ne sais pas si Ubuntu utilise systemd
, mais le comportement et la solution de contournement méritent d'être mentionnés dans votre réponse
La 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 des systemd
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
:
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=
ci - dessous.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
inloginctl
(1).Notez que la configuration
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 ensystemd-run
(1).
Lisez la réponse liée pour en savoir plus.
isatty()
et se ferme-t-il s'il ne l'est pas?"
nohup
.