Sous Linux, un processus désigne un programme en cours d’exécution. Concrètement, le lancement de chaque commande démarre un processus.
On peut démarrer un processus de deux manières :
- Forground process : Processus attaché au terminal actif.
- Background process : Processus en arrière-plan / tâche de fond.
Dans la suite de l’article, on suppose l’utilisation du shell bash.
Lancement d’un processus en arrière-plan :
Utilisation du caractère & :
Pour lancer un processus en arrière-plan, il suffit de rajouter le caractère & à la fin de la commande.
Une simple commande sleep poura nous service d’exemple. Toutefois, je préfère utiliser le script de start par défaut du serveur d’administration Weblogic :
[[email protected] bin]$ ./startWebLogic.sh & …. Notice WebLogicServer BEA-000365 Server state changed to STARTING. Notice WebLogicServer BEA-000365 Server state changed to RUNNING.
En utilisant ctrl+c, le processus continuera à fonctionner et on peut le constater en utilisant la commande ps :
[oracle@localhost bin]$ ps -ef | grep weblogic | grep -v grep | wc -l 2
Par contre, si vous fermez votre terminal, le processus sera arrété. En effet, si l’option shell/bash huponexit était activée lors du lancement du processus Weblogic, un exit de la session déclenchera un signal SIGHUP vers tout les processus lancés en tâche de fond.
shopt huponexit : Vérification de l’état du paramètre huponexit
shopt -s huponexit : Activation du paramètre huponexit
shopt -u huponexit : Désactivation du paramètre huponexit
[[email protected] bin]$ exit logout [[email protected] ~]# Notice WebLogicServer BEA-000388 JVM called the WebLogic Server shutdown hook. The server will force shutdown now. Notice WebLogicServer BEA-000396 Server shutdown has been requested by WLS Kernel.
On remarque que le serveur Weblogic a été arrêté après l’exécution de la commande exit.
Utilisation de la commande nohup :
Pour que le processus continu à tourner même après la fermeture du terminal, vous devez utiliser la commande NOHUP comme suit :
[[email protected] bin]$ nohup ./startWebLogic.sh & [1] 55115 [[email protected] bin]$ nohup: ignoring input and appending output to ‘nohup.out’ ^C [[email protected] bin]$ exit logout [[email protected] ~]# ps -ef |grep weblogic |wc -l 5
Le processus lancé ne sera associé à aucun terminal. La commande nohup redirigera donc les sorties standard et d’erreur du processus vers un fichier nohup.out qui sera créé dans le répertoire courant. Le processus fonctionnera toujours après un exit de la session courante.
Que faire si on a oublié de lancer un script en arrière-plan ?
Il est vrai qu’il se peut qu’on ait oublié d’exécuter une commande ou un script en tâche de fond et qu’on ne veuille pas interrompre son traitement, mais heureusement, plusieurs commandes Linux permettent de gérer cette situation sans avoir à arrêter le processus associé. Il suffit de suivre les étapes suivantes :
- Suspendre le processus en utilisant le raccourci Ctrl+Z : Ceci permet d’envoyer un signal SIGSTOP au processus. Ainsi, le système n’allouera plus de temps CPU et son état deviendra idle (On peut décrire cet état comme si le processus est en pause).
- la commande jobs : Elle permet de lister l’ensemble des jobs attachés à la session courante et leurs status.
- Reprendre le processus en arrière plan grâce à la Commande bg : Cette commande permet de reprendre/relancer les processus suspendus et les lancer comme tâche de fond.
- Utiliser la commande disown : Cette commande permet de marquer le job de manière à ce que le signal SIGHUP ne lui est pas envoyé suite à un exit de la session.
Cette séquence peut être appliquée pour notre processus Weblogic de la manière suivante :
[oracle @localhost bin]$ ./startWebLogic.sh … Notice WebLogicServer BEA-000360 The server started in RUNNING mode. Notice WebLogicServer BEA-000365 Server state changed to RUNNING. ^Z ==> Utilisation du raccourci crtl +z [1]+ Stopped ./startWebLogic.sh [oracle @localhost bin]$ bg 1 ==> Reprise du processus en arrière plan [1]+ ./startWebLogic.sh & [[email protected] bin]$ disown %1 ==> Dissociation du processus du terminal courrant [oracle @localhost bin]$ exit logout [[email protected] ~]#
En vérifiant encore une fois moyennant la commande ps, on s’aperçoit que le processus Weblogic fonctionne toujours.
ps -ef | grep weblogic |grep -v grep |wc -l 2