Ctrl-z, fg, bg, kill, jobs

De Ensiwiki
Aller à : navigation, rechercher

Utilité

Avec les environnements multi-fenêtrés, nous sommes habitués à exécuter plusieurs applications simultanément et à jongler entre ces dernières : surfer sur le web tout en regardant nos mail et en rédigeant un rapport sur un traitement de texte. Est-il possible de lancer plusieurs programmes dans un seul et unique terminal ? La question a son importance puisque le lancement d'une commande qui prend beaucoup de temps nous fait perdre la main sur le terminal sur lequel on l'exécute.

Imaginons que nous ne puissions interagir avec une machine distante qu'à travers un terminal. Comment est-il possible de faire tourner plusieurs applications sans avoir à ouvrir autant de terminaux que d'applications ? Tout simplement en faisant tourner ces applications en tâche de fond.

Lançons dans un terminal :

  telesun> sleep 10

Que se passe-t-il ? Nous perdons la main sur le terminal pendant 10s. Le processus tourne au premier plan (foreground) et nous sommes contraints d'attendre la fin de son exécution pour exécuter une nouvelle commande. 2 moyens sont possibles pour regagner la main :

  • « Control-C » ce qui met fin à la commande et donc nous redonne immédiatement la main
  • « Control-Z » ce qui permet de suspendre la commande et « bg » de la faire passer en arrière plan. Nous regagnons également la main mais la commande suspendue continue à s'exécuter en tâche de fond.

Une petite démo

Comme un exemple est plus explicite, essayons la suite de commandes suivantes :

  1. Depuis un interpréteur de commande, faire : man kill
  2. Puis interrompre ce processus dans l'interpréteur de commande par Control-Z
  3. Recommencer avec xterm (sans mettre de &).
  4. Recommencer avec man jobs
    • Que retourne la commande jobs ? Elle indique tous les processus lancés dans le terminal.
  5. Taper fg qui remet le processus courant interrompu en premier plan, et lire cette page. Interrompre la lecture avec Ctrl-Z
    • Que remarquez-vous sur la fenêtre xterm ? Nous n'avons pas la main dans ce nouvel xterm.
  6. Faire revenir la page manuel de kill au premier plan en utilisant fg %nn est le numéro entre crochet de ce processus. Interrompre la lecture avec Ctrl-Z.
  7. Relancer le xterm en arrière plan, grâce à la commande bg (similaire à fg).
    • Qu'indique jobs ? Comment se comporte le xterm? jobs indique que l'état du processus xterm est running. On peut écrire dans le nouveau terminal xterm ainsi que dans le tout premier
  8. Remettre le xterm au premier plan grâce à fg.
    • Comment se comporte-t-il ? On perd la main sur le xterm initial
  9. Interrompre son exécution grâce à Control-Z. Envoyer le signal SIGCONT (man -s7 signal) à cet xterm, en utilisant la notation %
    • Que se passe-t-il ? le second xterm est remis en arrière plan libérant le premier xterm
  10. Remettre le xterm au premier plan. Et dans ce xterm, envoyer le signal SIGSTOP à lui-même.
    • Que se passe-t-il ? Le second xterm est suspendu.
  11. Essayer de relancer le xterm en utilisant bg dans l'interpréteur.
    • Que se passe-t-il si on essaye de mettre le processus man kill en arrière plan ? Pourquoi ? Il est suspendu car il ne peut à la fois être lisible dans le terminal tout en laissant la main sur le terminal lui même.

En images, cela donne : http://screencast.com/t/IPFJhBPs