Linux / Commande jobs : voir les tâches du shell et distinguer leur PID

jobs affiche les tâches en arrière-plan ou suspendues que le shell Bash courant gère dans sa table de tâches. Il ne consulte pas tous les processus de la machine. Une liste vide dans jobs peut donc coexister avec de nombreux processus visibles dans ps.

Créer puis observer une tâche dans le même shell

jobs [options] [spécification-de-tâche]

Dans un terminal Bash, lancez cette attente en arrière-plan puis demandez la liste immédiatement :

sleep 10 &
demo_pid=$!
jobs
jobs -l

Le caractère & rend la main au shell pendant que sleep attend. La variable demo_pid mémorise le PID du dernier processus lancé en arrière-plan ; jobs -l ajoute les PID à l'affichage des tâches. Exemple illustratif :

[1]+ 12345 Running  sleep 10 &

[1] désigne le numéro de tâche dans ce shell et 12345 le PID de cet exemple simple. Les valeurs et la langue du statut varient. Le signe + indique la tâche courante du contrôle des tâches ; ce n'est pas une indication de priorité processeur.

Lancez les contrôles avant la fin des dix secondes. Si sleep a déjà terminé, le shell peut annoncer sa fin puis retirer son entrée : recréez une tâche pour refaire l'observation, au lieu d'interpréter son absence comme un échec de jobs.

Distinguer numéro de tâche, PID et pipeline

Une spécification comme %1 désigne la tâche numéro 1 du shell courant. Un nombre sans ce signe désigne généralement un PID dans une commande qui attend un processus. Ne remplacez pas l'un par l'autre simplement parce que les deux sont des nombres.

Une tâche peut être un pipeline comprenant plusieurs processus. Le numéro de tâche n'est donc pas un identifiant système universel pour un seul processus. Pour afficher le PID du chef de groupe associé aux tâches :

jobs -p

Dans le cas simple de sleep, vous pouvez rapprocher ce PID de demo_pid. Pour un pipeline, distinguez la tâche complète, ses processus et son chef de groupe avant de choisir une commande de contrôle.

Comprendre la portée et terminer l'exercice

Pendant que sleep existe encore, lancez un nouveau Bash qui consulte sa propre table :

bash -c 'jobs'

Ce nouveau shell n'a pas lancé votre tâche et sa liste est normalement vide. Cela ne signifie pas que le sleep du shell parent a disparu. Revenez à la portée du shell initial avec jobs -l ; pour examiner des processus indépendamment de sa table de tâches, utilisez ps et sa sélection de PID.

Dans le shell qui a lancé l'exercice, attendez simplement la fin de votre enfant :

wait "$demo_pid"
jobs

Sleep se termine sans avoir modifié de fichiers. S'il ne reste aucune autre tâche, jobs ne liste plus de tâche active après cette attente. Le délai restant dépend du temps passé à lire les résultats.

Pour arrêter une tâche avant son délai, utilisez seulement son identité vérifiée et les principes du guide kill et vérification de fin. Un exemple générique kill %1 n'est approprié que si %1 désigne bien votre cible dans ce même shell et que le contrôle des tâches permet cette notation.

Choisir une vue et reconnaître les limites

Option Bash Affichage
-l Statut des tâches avec les PID.
-p PID du chef de groupe de chaque tâche.
-r Tâches en cours d'exécution seulement.
-s Tâches suspendues seulement.

Dans un script ou un shell non interactif, le contrôle des tâches peut être désactivé. Une tâche asynchrone et un processus enfant peuvent néanmoins exister ; certaines opérations interactives et spécifications de tâches ne se comportent alors pas comme dans un terminal interactif.

Lancer en arrière-plan avec & ne garantit pas qu'un travail survive à la fermeture du terminal. Si cette continuité est nécessaire, choisissez un outil adapté, comme une session tmux, nohup avec ses redirections appropriées, ou un service géré. Jobs sert à consulter la table du shell, pas à assurer cette persistance.

Le manuel du contrôle des tâches de Bash décrit jobs, wait et les autres commandes de ce contexte. L'aide help jobs précise les options de votre Bash installé.