Faire une commande de longue durée sur ssh


10

Je suis sshsur un serveur et je démarre un script Python qui prendra environ. 24 heures pour terminer. Et si ma connexion Internet s'éteint au milieu? Est-ce que cela arrêtera la commande?

Existe-t-il un moyen d'exécuter ma commande de longue durée de manière à ce que les déconnexions locales ne l'affectent pas et que je puisse continuer à voir sa sortie après une nouvelle connexion ssh?

Réponses:


29

La meilleure façon est d'utiliser screen(sur le serveur) pour démarrer une session pour exécuter la commande, puis déconnecter l'écran pour qu'il continue à fonctionner, et vous pouvez faire d'autres choses, ou simplement vous déconnecter du serveur. L'autre option consiste à utiliser nohupen combinaison avec de &sorte que vous aurieznohup <command> &


Écran. Ou vous pouvez configurer une tâche cron si c'est quelque chose que vous exécutez plus d'une fois.
xeon

2
Si vous êtes déconnecté pendant qu'il fonctionne à l'écran, screen -rvous vous reconnecterez.
dpflug

2

Vous pouvez également utiliser disownsi vous avez déjà commencé le processus sans screenounohup


2

Les réponses existantes peuvent bien fonctionner, mais j'avais besoin de quelque chose pour BusyBox (un shell et un ensemble d'outils pour un matériel minimal comme les routeurs domestiques). Mon système ne dispose pas screen, dtach, at, disown, ou même nohup! Donc grâce à tbc0 sur SO ( lien ), j'ai trouvé ce bijou. Il revient immédiatement mais le processus serveur continue de s'exécuter:

ssh myserver 'sleep 100 >&- 2>&- <&- &'

Ou, si plusieurs commandes sont nécessaires:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

Explication:

  • >&- - fermer la poignée standard
  • 2>&- - fermer stderr
  • <&- - fermer stdin
  • & - mettre le processus en arrière-plan

Cela n'utilise aucun programme externe et devrait fonctionner sur ksh, ash, Bourne shell, bash, etc.


1

Si vous fondez un processus et fermez votre session, le processus sera adopté par init (PID 1).

Si j'ai une session et que je fais:

]$ sleep 10000 &
]$ exit

et ouvrez une autre session et exécutez:

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

Mon processus est toujours en cours d'exécution et nous voyons que son processus parent est désormais 1 (init).

Alternativement, vous pouvez configurer votre script comme vous le feriez pour un démon. Une recherche rapide révèle ce lien apparemment utile: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Si vous vouliez adopter cette approche.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.