Envoyer un processus en arrière-plan et au premier plan avec Linux
Attention
Cet article a été publié il y a plus d'un an, il peut y avoir des développements été.
S'il vous plaît prendre en compte.
Il y a quelques articles nous avons parlé de screen
: une application en ligne de commande qui permet de créer des sessions virtuelles contenant des fenêtres de terminal virtuel auxquelles on peut se connecter ou se déconnecter à volonté via la session de terminal en cours.
Screen est un programme très puissant, intuitif après quelques utilisations, qui peut faire beaucoup de choses (et en fait les raccourcis sont nombreux et trop nombreux pour être listés), mais aujourd'hui on parle des sessions classiques.
Dans ce cas également une commande peut durer plusieurs minutes, voire des heures. Il faut donc un système pour libérer le terminal et exécuter de nouvelles commandes, laissant les anciens fonctionner en arrière-plan.
Démarrer un processus en arrière-plan
Supposons que nous ayons un processus qui, une fois fait, occupe la session du terminal et nous empêche d'exécuter d'autres commandes jusqu'à la fin de l'exécution. Par exemple, au cas où votre disque de données est volumineux et plein de données updatedb
cela peut prendre beaucoup de temps pour compléter l'index du fichier.
~# updatedb
Nous avons deux solutions.
Utilisez le “et – commercial” (&)
La première méthode consiste simplement à ajouter un & à la fin de la commande. Le processus passera automatiquement en arrière-plan, la coquille sera libérée et pourra être utilisée immédiatement.
~# updatedb &
[1] 342824
~#
Dans ce scénario, ainsi que la mise à disposition immédiate du terminal, la commande renvoie le numéro d'identification du processus (PID) avec lequel nous pouvons surveiller l'état d'exécution via la commande ps
.
~# ps ax | grep updatedb
342824 pts/2 S 0:00 /bin/sh /usr/bin/updatedb
~#
Utilisez le raccourci Ctrl+Z et la commande bg
Cette méthode est encore plus intéressante que la première, car même si nous n'attendons pas la commande, cela peut geler le terminal pendant longtemps, nous pourrons mettre le processus en pause et l'envoyer en arrière-plan pour continuer l'exécution.
~# updatedb
^Z # Here i clicked Ctrl+Z
[2]+ Fermato updatedb
~# bg
[2]+ updatedb &
~#
Ci-dessus, j'ai exécuté à nouveau la commande updatedb
, Je l'ai mis en pause avec le raccourci Ctrl+Z
, j'ai exécuté la commande bg
pour mettre la commande en pause en arrière-plan.
Une liste des processus d'arrière-plan
Cela, mais je ne veux pas perdre le contrôle. Combien et quels processus j'ai envoyés en arrière-plan?
:~# jobs
[1]- In esecuzione sleep 500 &
[2]+ In esecuzione updatedb &
~#
Pour reprendre un processus, nous utilisons la commande fg
avec le numéro relatif au processus que nous voulons restaurer.
~# jobs
[1]- In esecuzione sleep 500 &
[2]+ In esecuzione updatedb &
~# fg %2
updatedb
Bien sûr, nous pouvons remettre la commande qui vient d'être restaurée en arrière-plan avec Ctrl+Z
et bg
nous fermant dans une boucle éternelle.
Rendre un processus persistant même lorsque le shell est fermé
Lorsqu'un processus a été mis en arrière-plan par une session, lorsque la session est fermée, le processus se terminera également. Cet aspect peut poser problème notamment dans le cas de connexions instables (SSH).
Le plus simple dans ce cas est d'utiliser screen
, mais en général, si ce n'est pas ce que nous voulons, nous pouvons faire en sorte qu'un processus persiste même après la fermeture de la session simplement à partir de la session avec la commande nohup
.
Cette commande est immunisée contre les raccrochages et peut ignorer les signaux SIGHUP émis vers un processus.
La commande nohup
il doit être utilisé avant le processus que nous voulons “déconnecter”.
~# nohup updatedb &
Nous pouvons maintenant terminer la session en cours, ouvrez un autre terminal et vérifiez que le processus est toujours en cours d'exécution avec ps ax | grep updatedb
.
0 commentaires