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 à.