Lors de l’administration d’un serveur (qu’il soit Aix, Solaris ou Linux), certaines commandes peuvent prendre plus de temps que prévu pour leurs exécution.
Que se passe-t-il en cas de déconnexion de la session? L’arrêt d’un script en cours peut entraîner un problème d’intégrité des données (ex : base de données en cours de modification, création de file-system en cours, etc…)
Pour remédier à ce genre de problèmes, il existe une solution au niveau OS qui est le lancement de la commande en arrière plan.
Lancement en arrière plan
Pour effectuer le lancement d’une commande en arrière plan, il est nécessaire d’ajouter le caractère & à la fin de la commande. Toutefois, pour éviter que la commande ne soit tuée lors d’une déconnexion, il faut rajouter l’instruction nohup au début de celle-ci.
Par exemple :
1 2 |
root@basmut:/root # nohup sleep 30000 & [1] 4673 |
Remarque : Si nous vérifions les processus à l’aide de la commande ps, nous verrons que la commande sleep est en cours d’exécution.
Bascule en arrière plan
Comme expliqué dans l’introduction de l’article, il peut arriver qu’une commande prenne du temps (ex : import d’un dump Oracle) et que l’administrateur n’ait pas lancé la commande en nohup. Dans ce cas là, il est encore possible de basculer la commande en arrière plan, pour qu’elle continue sont exécution.
Pour se faire, il suffit d’interrompre la commande avec la combinaison de touche Ctrl+Z et de la relancer en arrière plan, à l’aide de la commande bg.
- Lancement de la commande
1 |
root@basmut:/root # sleep 30000 |
- Vérification des jobs
1 |
root@basmut:/root # jobs |
Remarque : Nous remarquons qu’actuellement, aucun job n’est présent sur le serveur.
- Interruption de l’exécution
1 2 |
root@basmut:/root # ^Z <== Interruption via Ctrl+Z [1]+ Stopped sleep 30000 |
- Vérification des jobs
1 2 |
root@basmut:/root # jobs [1]+ Stopped sleep 30000 |
Remarque : Nous remarquons que le job que nous venons d’arrêter est maintenant présent sur le serveur.
- Bascule en arrière plan
1 2 |
root@basmut:/root # bg [1]+ sleep 30000 & |
- Vérification des jobs
1 2 |
root@basmut:/root # jobs [1]+ Running sleep 30000 & |
Remarque : Le job est maintenant actif en arrière plan sur le serveur.
Bascule en arrière plan avec nohup
Une fois le job basculé en arrière plan, il est intéressant pour nous de le basculer en nohup. Pour se faire, il suffit d’utiliser la commande nohup avec l’argument -p suivi du PID de la commande.
- Récupération du PID de la commande
1 2 |
root@basmut:/root # jobs -l [1] + 10469 Running sleep 300000 & |
- Bascule en mode nohup
1 2 |
root@basmut:/root # nohup -p 10469 Sending output to nohup.out |
Remarque : Sous Linux, plus particulièrement, sous bash, il est nécessaire d’utiliser la commande disown avec l’option -h suivi du PID.
Exemple :
1 2 3 |
root@basmut:/root # jobs -l [1] + 10469 Running sleep 300000 & root@basmut:/root # disown -h 10469 |