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.

Warning

La syntaxe de tmux a changé au cours du temps, nous donnons ici la syntaxe pour la version 3.3 (la plus récente à ce jour).

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 votre session tmux est détachée
#=> vous pouvez fermer votre connexion ssh
logout

ssh foo@robot
tmux attach

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, tmux lancera la commande et quittera:

tmux new -d ./programme
#nous sommes sorti tout de suite de tmux
#nous pouvons retourner dans la session via `tmux attach`

Vous pouvez créer plusieurs sessions si besoin, et vous reconnecter à une session en particulier (ici masession). Les sessions peuvent être très utile si vous êtes plusieurs à accéder à la même machine avec le même login.

tmux new -s masession

Vous pourrez vous reconnecter à cette session via

tmux attach -t masession

Vous pouvez vous connecter à une session en la créant si non existante. L'option -A indique de faire attach au lieu de new si la session désirée existe déjà.

tmux new -A -s masession

Pour voir les sessions actives:

tmux list-sessions

Pour voir terminer une session active:

tmux kill-session -t masession

Combiné à SSH, cela vous permet de lancer rapidement des programmes tournant en tache de fond:

ssh tp-1a201-06 tmux new -A -d ./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 new -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 !