J’ai récemment mis à jour mon article sur Rsync pour rapatrier quelques fichiers d’un serveur vers mon NAS Synology. Or, une question revient vite dès qu’une commande doit tourner pendant plusieurs heures : comment lancer une tâche depuis un terminal, fermer ce terminal, puis laisser la commande continuer tranquillement ?
Par défaut, ce n’est pas toujours gagné. Quand on ferme un terminal, le shell peut envoyer un signal SIGHUP aux processus qu’il a lancés. Résultat : la commande peut s’arrêter, même si elle était encore en train de travailler.
Heureusement, Bash propose plusieurs méthodes pour lancer une commande en arrière-plan, la détacher du terminal, ou même retrouver une session plus tard. Voici les solutions que je garde sous le coude.
Lancer une commande en arrière-plan avec &
La méthode la plus simple consiste à ajouter une esperluette & à la fin de la commande. Bash lance alors le processus en arrière-plan et rend immédiatement la main au terminal.
sleep 100 &
Le shell affiche alors un numéro de job et un identifiant de processus, aussi appelé PID :
[1] 12345Code language: JSON / JSON with Comments (json)
C’est pratique, mais ce n’est pas suffisant si vous voulez fermer le terminal sans risque. La commande reste encore rattachée à la session du shell.
On peut vérifier les tâches lancées depuis le shell courant avec :
jobs
Et on peut vérifier que le processus tourne toujours avec :
ps aux | grep sleep