Si ejecuto este comando en un script, no produce salida excepto el encabezado de ps
:
# Taken from Advanced Bash Usage on youtube:
echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
Esta es la salida:
$./testing.bash
PID TTY STAT TIME COMMAND
pero aquí se ejecuta en una terminal que produce el resultado esperado :
$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
PREGUNTA:
¿Puedes explicarme la diferencia y mostrarme la forma correcta de hacerlo?
Probé muchas cosas y busqué en Google durante 4 horas. Si lo necesita, puedo enumerar lo que probé, pero no creo que sea relevante aquí.
$echo $SHELL
/bin/bash
y:
$head -1 testing.bash
#!/bin/bash
Respuesta aceptada:
ps
‘ -s sessionid
La opción es seleccionar procesos en función de su ID de sesión.
Puedes usar ps -j
para ver la identificación de la sesión de los procesos. Las sesiones junto con los grupos de procesos generalmente se usan para el control de trabajos de shell (de ahí el -j
).
Su emulador de terminal crea una nueva sesión con el proceso que luego reutiliza para ejecutar su shell preferido. Entonces, en una terminal, la identificación de la sesión generalmente será la misma que la pid de ese shell.
Entonces, si ejecuta ps -j -s "$$"
en eso shell, obtendrá los procesos en la sesión porque "$$"
sucede para ser el mismo que el ID de la sesión.
Si ejecuta ese comando en cualquier otro shell (como el shell que se ejecuta en un proceso secundario para interpretar su testing
script), cualquier shell que no sea un líder de sesión, no obtendrá nada porque no hay una sesión con una identificación que corresponda al pid de ese 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
$$
es 7239, el líder de la sesión. De modo que ps -j -s 7239
me da todos los procesos en esa sesión.
$ 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
El primer ps
comando no devuelve nada porque, como el segundo ps
muestra, no hay sesión con id 21044 ya que el proceso de id 21044 no es un líder de sesión. El líder de la sesión sigue siendo 7239, el shell iniciado por el emulador 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
Ahora, vemos todos los procesos en la sesión. Usamos ps -o sid= -p "$$"
para obtener la identificación de la sesión que $$
pertenece a.