GNU/Linux >> Linux Esercitazione >  >> Linux

Processi in una sessione in una shell interattiva vs in uno script?

Se eseguo questo comando in uno script, non produce output tranne l'intestazione da ps :

 # Taken from Advanced Bash Usage on youtube:

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

Questo è l'output:

$./testing.bash
  PID TTY      STAT   TIME COMMAND

ma qui viene eseguito in un terminale che produce l'output atteso :

$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

DOMANDA:

Puoi spiegare la differenza e mostrarmi il modo giusto per farlo?

Ho provato molte cose e ho cercato su Google per 4 ore, se hai bisogno posso elencare quello che ho provato ma non penso che sia rilevante qui.

$echo $SHELL
/bin/bash

e:

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

Risposta accettata:

ps ' -s sessionid l'opzione è selezionare i processi in base al loro ID di sessione.

Puoi usare ps -j per vedere l'ID di sessione dei processi. Le sessioni insieme ai gruppi di processi sono generalmente utilizzate per il controllo del lavoro della shell (da cui il -j ).

Il tuo emulatore di terminale crea una nuova sessione con il processo che poi riutilizza per eseguire la tua shell preferita. Quindi, in un terminale, l'id di sessione sarà generalmente lo stesso del pid di quella shell.

Quindi, se esegui ps -j -s "$$" in quello shell, otterrai i processi nella sessione perché "$$" succede essere uguale all'ID della sessione.

Se esegui quel comando in qualsiasi altra shell (come la shell che viene eseguita in un processo figlio per interpretare il tuo testing script), qualsiasi shell che non sia un leader di sessione, non otterrai nulla perché non esiste una sessione con un id che corrisponda al pid di quella 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

$$ è 7239, il leader della sessione. In modo che ps -j -s 7239 mi dà tutti i processi in quella sessione.

$ 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

Il primo ps comando non restituisce nulla perché, come il secondo ps shows, non c'è sessione con id 21044 poiché il processo di id 21044 non è un leader di sessione. Il leader della sessione è ancora 7239, la shell avviata dall'emulatore di terminale.

$ 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

Ora vediamo tutti i processi nella sessione. Abbiamo usato ps -o sid= -p "$$" per ottenere l'ID della sessione che $$ appartiene a.

Correlati:verificare se ci sono file che corrispondono a un modello per eseguire uno script?
Linux
  1. Determinare la shell nello script durante il runtime?

  2. Determinazione del percorso per lo script della shell di origine?

  3. Come gestire gli interruttori in uno script di shell?

  4. Shell Script per stampare la piramide di stelle

  5. Script di traslitterazione per shell linux

Come utilizzare le variabili negli script della shell

Come creare script di shell

Come eseguire un comando in uno script della shell?

Directory corrente dello script Shell?

Un file .sh può essere un malware?

Lo script di shell è un linguaggio di programmazione?