Tutoriel UNIX

FAQ

Comment lancer un processus sur un serveur par SSH en arrière plan ?
Comment se connecter de l'extérieur en ssh à un serveur distant à travers une passerelle ?

Comment lancer un processus sur un serveur par SSH en arrière plan ?

Si on souhaite effectuer une tâche de longue durée sur un serveur à distance via un tunnel SSH (de manière à ne pas utiliser les ressources de son ordinateur), on aimerait pouvoir se déconnecter, pour éteindre son ordinateur (ou anticiper une éventuelle déconnexion due à des problèmes de réseau), et que le processus continue sur la machine à distance. Pour cela on utilise la commande nohup qui va lancer le processus en "background" comme ceci :

nohup ma_commande &

Dès lors la machine à distance exécute la commande de manière autonome et complètement transparente. On peut alors sans problème se déconnecter de la machine distante, et revenir ultérieurement voir le résultat. Les questions qui se posent alors sont :

1) Comment connaître l'état d'avancement du processus ?

Si ma_commande génère normalement des sorties vers le terminal, le recours à nohup dissimule celles-ci et ne permet donc pas de savoir où en est le programme. On va donc sauvegarder ces informations précieuses en les envoyant dans un fichier sortie.out :

nohup ma_command > sortie.out 2>&1&

L'ajout de 2>&1 permet par ailleurs de rediriger les erreurs.

Ainsi on peut vérifier l'état d'avancement en consultant le fichier sortie.out :

tail sortie.out

Ou mieux si on veut suivre l'état d'avancement "en live" :

tail -f sortie.out

Enfin on peut connaître le temps d'exécution au fur et à mesure en rajoutant la commande time :

nohup time ma_command > sortie.out 2>&1&

2) Comment arrêter le processus avant la fin d'exécution ?

Pour cela il faut connaître le numéro assigné au processus (le PID). Or encore une fois la commande nohup dissimule cette information, qui n'est plus directement répertoriée dans la liste de processus donnée par la commande "ps". L'idée est de rechercher ma_commande parmi tous les processus lancés :

ps -ef | grep "ma_commande"

et repérer le PID associé. Ou encore lister tous les processus actifs dont vous êtes l'auteur :

ps -ef | grep `whoami`

Pour le tuer il suffit de faire :

kill -9 pid

Mais au lieu de rechercher bêtement un PID perdu dans la nature, il est préférable de systématiquement l'enregistrer lorsque la commande nohup est lancée :

nohup time ma_command > sortie.out 2>&1&
echo $! > save_pid.txt

où "$!" représente le PID du dernier processus exécuté. Ainsi si on veut par la suite tuer le processus il suffit d'écrire :

kill -9 `cat save_pid.txt`

Comment se connecter de l'extérieur en ssh à un serveur distant à travers une passerelle ?

Une fois l'autorisation accordée à se connecter à la passerelle ssh-ljk.imag.fr, on peut ouvrir un tunnel ssh de notre machine (par exemple sur le port 1234) vers le serveur distant tetta.imag.fr (sur le port 22 pour le protocole ssh) en passant par la passerelle polisank@ssh-ljk.imag.fr

ssh -N -L 1234:tetta.imag.fr:22 polisank@ssh-ljk.imag.fr &

Dans un autre terminal, pour se connecter au serveur distant on tape :

ssh -p 1234 localhost

Haut de page

css.php