GNU/Linux >> Tutoriales Linux >  >> Linux

¿Procesos en una sesión en un shell interactivo versus en un script?

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.

Relacionado:¿Probar si hay archivos que coincidan con un patrón para ejecutar un script?
Linux
  1. ¿Determinar Shell en el script durante el tiempo de ejecución?

  2. ¿Tiempo de espera agotado en un script de Shell?

  3. ¿Determinar la ruta al script de Shell de origen?

  4. ¿Cómo manejar los interruptores en un script de Shell?

  5. ¿Comportamiento inesperado de un script de Shell?

Cómo usar variables en secuencias de comandos de Shell

Cómo crear scripts de shell

¿Cómo verificar si un shell es de inicio de sesión/interactivo/por lotes?

¿Cómo ejecutar un comando en un script de Shell?

¿Es shell script un lenguaje de programación?

Ejecute un script de shell como un usuario diferente