Gestion des processus de fond de bash

Gestion des processus de fond de bash

Il y a plusieurs fois où un développeur ou un utilisateur Bash voudra exécuter un processus en arrière-plan, soit à partir de la ligne de commande, soit à l'intérieur d'un script bash, puis de gérer à nouveau ce même processus plus tard. Il existe différents outils de ligne de commande qui permettent de le faire. Pouvoir démarrer, gérer et détruire les processus de fond est une exigence pour de nombreuses tâches de niveau avancées, en particulier dans les domaines des scripts avancés et du contrôle des processus.

Dans ce tutoriel, vous apprendrez:

  • Comment démarrer, gérer et / ou gérer et détruire les processus de fond
  • Quels outils de ligne de commande sont disponibles pour vous aider dans la gestion des processus bash
  • Exemples mettant en évidence l'utilisation des processus d'arrière-plan sur la ligne de commande bash
Gestion des processus de fond de bash

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution Linux
Logiciel Ligne de commande bash, système basé sur Linux
Autre Toute utilité qui n'est pas incluse dans le shell bash par défaut peut être installée en utilisant Sudo Apt-Get Install Utility-Name (ou Installation de miam pour les systèmes basés sur Redhat)
Conventions # - nécessite que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - exige que les commandes Linux soient exécutées en tant qu'utilisateur régulier non privilégié

Exemple 1: démarrer un processus en arrière-plan et le ramener au premier plan

$ sleep 1000 & [1] 25867 $ fg sleep 1000 


Ici, nous avons commencé un processus de sommeil de 1000 secondes en arrière-plan. Si nous voulons mettre un processus en arrière-plan, nous pouvons utiliser l'ampersand (&) Signer derrière n'importe quelle commande. Cela placera le processus en arrière-plan et rapporte le Piquer (ID de processus, un numéro d'identifiant qui identifie tout processus exécuté sur une machine Linux). Dans cet exemple, le Piquer est 25867. Notez que le processus continue de fonctionner lorsqu'il est placé en arrière-plan, ce qui nous donne le meilleur des deux mondes; Le processus s'exécute et nous récupérons notre ligne de commande en attendant! Super.

Nous plaçons ensuite le processus au premier plan (comme s'il n'y avait jamais eu d'instructions de fond) en utilisant le FG (je.e. Commande de premier plan). Le résultat est que nous voyons quel processus est à nouveau placé au premier plan (je.e. sommeil 1000) Et notre invite de commande ne revient pas lorsque nous avons remis le sommeil au premier plan et l'invite de commande ne reviendra que lorsque le sommeil de 1000 secondes sera terminé.

Disons que nous avons placé le sommeil 1000 en arrière-plan, a-t-il travaillé pendant 500 secondes, puis exécuté FG… Combien de temps le sommeil fonctionnerait-il encore? Si vous devinez (ou saviez) 500 secondes, alors vous avez raison. Les 500 premières secondes ont été consacrées à la course comme un processus de fond, et les 500 secondes seront un processus de premier plan.

Notez également que si vous terminez le shell, votre commande se terminera - qu'elle s'exécute en arrière-plan ou au premier plan (sauf si vous l'avez renié, plus à ce sujet dans l'exemple suivant).

Exemple 2: renier un processus

$ sleep 1000 & [1] 26090 $ Diet% 1 $ 

Ici, nous avons commencé un sommeil supplémentaire de 1000 secondes, et nous avons été informés du PID du processus de fond comme avant. Ensuite, nous avons exécuté Diet% 1, se référant au premier processus de fond (comme indiqué également par le [1] Avant le pid!), et instruire Bash à renier (dissocier) ce processus à partir de la coquille actuelle. Ce n'est pas qu'il sera dissocié de l'utilisateur actuel (et par exemple ps -ef | sommeil grep | grep -v grep montrera en effet toujours votre utilisateur), mais plutôt à partir de la session de shell actuelle. Regarder:

$ sleep 1000 & [1] 26214 $ Diet% 1 $ ps -ef | sommeil grep | grep -v grep roel 26214 26120 0 13:13 pts / 3 00:00:00 sommeil 1000 $ 

Ensuite, ouvrant une nouvelle coque et réexécutant le ps Nous pouvons voir que la commande est toujours là et est maintenant attachée à PPID (Parent PID) 1 au lieu de 26120 En tant que parent PID:

$ ps -ef | sommeil grep | grep -v grep roel 26214 1 0 19:48 ? 00:00:00 sommeil 1000 

C'est comme si le shell était toujours en cours d'exécution (notez le 26214 Pid toujours actif / associé à la course dormir), cependant, la partie de la ligne de commande active a disparu!

Super, donc cela nous donne un moyen de dissocier les processus à partir de la coquille actuelle et de s'assurer ainsi qu'ils continuent de fonctionner lorsque notre séance de coquille est fermée.

Exemple 3: Placer une commande en arrière-plan

$ sleep 1000 ^ z [1] + arrêt de sommeil 1000 $ bg% 1 [1] + sommeil 1000 & $ 

Ici, nous avons commencé un sommeil 1000 au premier plan (non & a été utilisé), et l'interrompu ce processus avec le raccourci clavier Ctrl + z. Notez que tandis que la sortie dit ^ Z (et ^ est un symbole à indiquer Ctrl), le Z est en fait une minuscule z, Vous n'avez donc pas besoin d'utiliser CHANGEMENT, juste Ctrl + z.

Notez que le processus s'est effectivement arrêté, il n'a pas continué à courir. Maintenant, nous avons placé le processus en arrière-plan et l'avons arrêté. Pour laisser ce processus continuer à fonctionner maintenant, nous avons deux options; fg% 1 - je.e. Placer le processus indiqué par [1] retour au premier plan et continuer à courir normalement, ou BG% 1 qui reprendra le processus, mais en arrière-plan. Dans l'exemple, nous pouvons voir ce dernier, et notre invite de commande revient comme prévu.

Notez que ce qui précède peut être légèrement augmenté avec renier, correspondant à un moyen souvent utilisé pour gérer un processus lors de l'utilisation d'un serveur distant. Disons que vous êtes connecté via SSH à un serveur distant et que vous avez commencé un gros travail, par exemple une sauvegarde ou une génération de rapport. Maintenant, vous souhaitez quitter votre bureau pour la journée, mais vous ne savez pas si votre connexion SSH restera en direct toute la nuit, et même si votre ordinateur ne s'hibera pas ou ne sera pas similaire. Toute de ces actions pourrait compromettre le travail de course!

Dans ce cas, vous pouvez effectuer ce qui suit;

$ Sleep 1000 ^ z [1] + arrêt de sommeil 1000 $ bg% 1 [1] + Sleep 1000 & $ Diet% 1 $ 


Et s'éloignez-vous de votre ordinateur heureux et en toute sécurité (après l'avoir verrouillé;), comme vous pouvez le faire l'assuré - même si votre connexion SSH échoue, ou que votre ordinateur hiberne, ou que la dame de nettoyage élimine le cordon d'alimentation - que votre travail restera en cours. Comme le processus a été renommé / dissocié de la session de coquille actuelle, elle continuera à s'exécuter même si la session de coquille actuelle est en quelque sorte terminée.

Une petite mise en garde est que vous ne pouvez pas utiliser FG Le matin pour ramener le travail au premier plan, même si votre connexion SSH et Shell ne se sont jamais terminés / échoués:

$ fg bash: fg: actuel: pas de tel travail $ fg% 1 bash: fg:% 1: pas de tel travail 

Quand il est renié, il est dissocié et parti! Le travail sera toujours en arrière ps -ef | grep your_process_name | grep -v grep.

Exemple 4: Processus d'arrière-plan multiples et processus de terminaison

Nous commençons d'abord deux processus en arrière-plan en utilisant notre confiance sommeil 1000 exemple:

$ sleep 1000 & [1] 27158 $ Sleep 1000 & [2] 27159 

Nous pouvons voir ici que deux processus d'arrière-plan ([1] et [2], avec PID 27158 et 27159 respectivement) ont commencé. Ensuite, nous tuons le premier processus:

$ kill% 1 $ [1] - résiliée au sommeil 1000 $ 

C'était simple / facile, à droite? Une question que l'on peut se poser est pourquoi les informations résiliées ne s'affichent pas immédiatement (une pression supplémentaire est requise comme vous pouvez le voir) et la raison en est que le processus n'a pas été terminé avant le retour de la ligne de commande. Dans le cadre des travaux qui sont effectués à chaque fois qu'une nouvelle ligne de commande est affichée, il faut faire rapport sur un certain nombre de statuts, y compris l'état du processus de fond si nécessaire. Ainsi, lorsque l'entrée a été appuyé à nouveau (indiqué par le vide $ ligne, un rapport du processus terminé est affiché.

Exemple 5: l'un fait avant l'autre

Commençons à nouveau deux processus, mais cette fois, le deuxième processus ne dormira que pendant 3 secondes:

$ sleep 1000 & [1] 27406 $ Sleep 3 & [2] 27407 $ 

Après environ 5 secondes, en appuyant sur Entrée, nous verrons:

$ [2] + fait du sommeil 3 

Ce qui va se passer maintenant si nous utilisons FG Dans ce cas sans l'original [1] spécificateur?

$ fg sleep 1000 ^ z [1] + arrêt de sommeil 1000 $ 


Le premier processus se poursuivra! C'est également le cas si la procédure inverse a été utilisée:

$ Sleep 10 & [1] 27346 $ Sleep 1000 & [2] 27347 $ [1] - Done Sleep 10 $ fg Sleep 1000 ^ Z [2] + arrêt de sommeil 1000 

Le FG La commande prendra toujours la dernière commande qui a été placée en arrière-plan (et qui n'a pas encore été terminée) et la repose au premier plan.

Conclusion

Dans cet article, nous avons examiné diverses commandes, notamment bg, FG et l'ampère d'idiom bash de fond & qui peut être placé après n'importe quelle commande pour placer cette commande en arrière-plan. Nous avons également exploré l'utilisateur du tuer commande et examiner comment aborder divers processus d'arrière-plan en utilisant le % Bash idiome avec un numéro de processus de fond apparié comme %1 pour [1] etc.

Si vous souhaitez en savoir plus sur Bash en général, jetez un œil aux séries de conseils de ligne de commande et de trucs utiles.

Profitez de vos nouvelles compétences en bash et si vous faites quelque chose de cool avec les processus de fond, laissez-nous un commentaire ci-dessous!

Tutoriels Linux connexes:

  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Masterring Bash Script Loops
  • Boucles imbriquées dans les scripts bash
  • Choses à installer sur Ubuntu 20.04
  • Gestion de scripts et de processus de bash multithread au…
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Gestion de la saisie des utilisateurs dans les scripts bash
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Tutoriel de débogage GDB pour les débutants
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux