Skip to content

Exécution à distance

Contexte

Vous savez vous connecter via SSH sur une machine et donc faire tourner un programme sur cette machine.

Comme vu précédemment, toute fermeture de la session SSH fermera tous les programmes lancés par cette session. Il est certains cas où cela n'est pas désirable:

  • lancer des calculs en tâche de fond pour la nuit et se reconnecter
  • lancer un programme qui doit rester actif en cas de perte de connexion (WiFi par exemple)

Fort heureusement, la plupart des systèmes Linux/Unix nous offrent des outils pour contourner ce problème.

nohup

nohup est un utilitaire très simple qui prend en argument une ligne de commande et fait en sorte que les signaux de déconnexion ne terminent pas le programme ainsi lancé

nohup monprogramme &
exit

Le souci principal de cette commande est la complexité pour reprendre le contrôle sur le programme ainsi lancé.

Le second souci de cette commande avec SSH est que la session SSH restera active tant que les fichiers spéciaux stdout et stderr seront utilisés par un programme (lancé par SSH) se trouvant en arrière plan. Il faudra donc le plus souvent écrire:

  • si les messages du programme ne vous intéressent pas:

    nohup monprogramme >/dev/null 2> /dev/null &
    exit
    

  • si les messages vous intéressent:

    nohup monprogramme > out.txt 2> err.txt &
    exit
    

tmux

Le programme tmux est un multiplexeur de terminal, permettant de créer plusieurs fenêtres virtuelles dans un seul terminal, passer des programmes en arrière-plan, les attacher à d'autres fenêtres virtuelles, etc...

Une aide assez détaillée de tmux est disponible ici.

Une des possibilités intéressante de tmux est la possibilité de créer une session, lancer des programmes, fermer la session en laissant les programmes actifs et se reconnecter à la session plus tard. Pour notre cas d'usage ci-dessus:

ssh foo@host
tmux
python program.py
# puis taper ctrl+b suivi de d
# à partir d'ici vous pouvez fermer votre tmux et votre connexion ssh
tmux detach
logout

ssh foo@robot
tmux a

Vous pouvez créer plusieurs sessions si besoin, et vous reconnecter à une session en particulier

tmux new -s masession

Vous pourrez vous reconnecter à cette session via

tmux a -s masession

Vous pouvez combiner les deux, c'est-à-dire tester si une session existe, s'y attacher si c'est le cas ou en créer une nouvelle:

tmux -A -s masession

Il est aussi possible de créer votre session en état détaché via -d, tmux quittera immédiatement. Si vous passez une ligne de commande à exécuter, tmuxlancera la commande et quittera:

tmux -A -d -s masession ./programme

Combiné à SSH, cela vous permet de lancer rapidement des programmes tournant longtemps:

ssh tp-1a201-06 tmux -A -d -s masession ./programme

Vous pouvez combiner tmux avec votre configuration SSH pour toujours démarrer votre session avec une session tmux, comme expliqué ici:

Host cible.enst.fr
    RequestTTY yes
    RemoteCommand tmux -A -s sshtmuxsession

Ceci indique à SSH de lancer tmux en l'attachant à la dernière session lancée pour chaque connexion à cible.enst.fr.

Info

Une autre fonctionnalité intéressante de tmux est qu'il vous permet d'inviter d'autres personnes dans un terminal: vous pouvez ainsi travailler à plusieurs dans un même terminal depuis différentes machines !