GNU/Linux >> Tutoriels Linux >  >> Linux

Processus dans une session dans un shell interactif Vs dans un script ?

Si j'exécute cette commande dans un script, elle ne produit pas de sortie sauf l'en-tête du ps :

 # Taken from Advanced Bash Usage on youtube:

 echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"

Voici le résultat :

$./testing.bash
  PID TTY      STAT   TIME COMMAND

mais ici, il est exécuté dans un terminal qui produit la sortie attendue :

$echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
  PID TTY      STAT   TIME COMMAND
18289 pts/4    Ss+    0:00 /bin/bash
17917 pts/4    S+     0:00  \_ /bin/bash
17918 pts/4    S+     0:00      \_ /bin/bash
17919 pts/4    S+     0:00          \_ /bin/bash
17920 pts/4    S+     0:00              \_ /bin/bash
17921 pts/4    R+     0:00                  \_ ps wwf -s 18289

QUESTION :

Pouvez-vous expliquer la différence et me montrer la bonne façon de procéder ?

J'ai essayé beaucoup de choses et j'ai cherché sur Google pendant 4 heures, si vous avez besoin, je peux lister ce que j'ai essayé, mais je ne pense pas que ce soit pertinent ici.

$echo $SHELL
/bin/bash

et :

$head -1 testing.bash 
#!/bin/bash

Réponse acceptée :

ps ' -s sessionid L'option consiste à sélectionner les processus en fonction de leur identifiant de session.

Vous pouvez utiliser ps -j pour voir l'identifiant de session des processus. Les sessions ainsi que les groupes de processus sont généralement utilisés pour le contrôle des tâches du shell (d'où le -j ).

Votre émulateur de terminal crée une nouvelle session avec le processus qu'il réutilise ensuite pour exécuter votre shell préféré. Ainsi, dans un terminal, l'identifiant de session sera généralement le même que le pid de ce shell.

Donc, si vous exécutez ps -j -s "$$" dans cela shell, vous obtiendrez les processus dans la session car "$$" arrive être le même que l'identifiant de session.

Si vous exécutez cette commande dans un autre shell (comme le shell qui est exécuté dans un processus enfant pour interpréter votre testing script), tout shell qui n'est pas un leader de session, vous n'obtiendrez rien car il n'y a pas de session avec un identifiant qui correspond au pid de ce shell.

$ ps -j -s "$$"
  PID  PGID   SID TTY          TIME CMD
 7239  7239  7239 pts/7    00:00:00 zsh
21002 21002  7239 pts/7    00:00:00 ps

$$ est 7239, le leader de la session. Alors que ps -j -s 7239 me donne tous les processus de cette session.

$ sh -xc 'ps -j -s "$$"; ps -j -p "$$"'
+ ps -j -s 21044
  PID  PGID   SID TTY          TIME CMD
+ ps -j -p 21044
  PID  PGID   SID TTY          TIME CMD
21044 21044  7239 pts/7    00:00:00 sh

Le premier ps La commande ne renvoie rien car, comme le second ps montre, il n'y a pas de session avec l'id 21044 car le processus de l'id 21044 n'est pas un leader de session. Le leader de la session est toujours 7239, le shell lancé par l'émulateur de terminal.

$ sh -xc 'ps -j -s "$(($(ps -o sid= -p "$$")))"'
+ ps -o sid= -p 21215
+ ps -j -s 7239
  PID  PGID   SID TTY          TIME CMD
 7239  7239  7239 pts/7    00:00:00 zsh
21215 21215  7239 pts/7    00:00:00 sh
21217 21215  7239 pts/7    00:00:00 ps

Maintenant, nous voyons tous les processus de la session. Nous avons utilisé ps -o sid= -p "$$" pour obtenir l'identifiant de la session qui $$ appartient à.

En relation :Tester s'il existe des fichiers correspondant à un modèle afin d'exécuter un script ?
Linux
  1. Déterminer Shell dans le script pendant l'exécution ?

  2. Déterminer le chemin d'accès au script shell sourcé ?

  3. Comment gérer les commutateurs dans un script shell ?

  4. La signification de $ ? Dans un script shell ?

  5. Shell Script pour imprimer une pyramide d'étoiles

Comment utiliser des variables dans les scripts Shell

Comment créer des scripts shell

Comment exécuter une commande dans un script shell ?

Script bash :utilisation de la commande de script d'un script bash pour la journalisation d'une session

Script de translittération pour le shell Linux

déterminer le shell dans le script pendant l'exécution