GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Prozesse in einer Sitzung in einer interaktiven Shell oder in einem Skript?

Wenn ich diesen Befehl in einem Skript ausführe, erzeugt er keine Ausgabe außer dem Header von ps :

 # Taken from Advanced Bash Usage on youtube:

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

Dies ist die Ausgabe:

$./testing.bash
  PID TTY      STAT   TIME COMMAND

aber hier wird es in einem Terminal ausgeführt, das die erwartete Ausgabe erzeugt :

$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

FRAGE:

Können Sie den Unterschied erklären und mir zeigen, wie man das richtig macht?

Ich habe viele Dinge ausprobiert und 4 Stunden lang bei Google gesucht. Wenn Sie brauchen, kann ich auflisten, was ich versucht habe, aber ich denke nicht, dass das hier relevant ist.

$echo $SHELL
/bin/bash

und:

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

Akzeptierte Antwort:

ps-s sessionid Die Option besteht darin, Prozesse basierend auf ihrer Sitzungs-ID auszuwählen.

Sie können ps -j verwenden um die Sitzungs-ID von Prozessen anzuzeigen. Sitzungen zusammen mit Prozessgruppen werden im Allgemeinen zur Steuerung von Shell-Jobs verwendet (daher der -j ).

Ihr Terminalemulator erstellt eine neue Sitzung mit dem Prozess, den er dann wiederverwendet, um Ihre bevorzugte Shell auszuführen. In einem Terminal ist die Sitzungs-ID also im Allgemeinen dieselbe wie die PID dieser Shell.

Wenn Sie also ps -j -s "$$" ausführen darin das Shell erhalten Sie die Prozesse in der Sitzung, weil "$$" passiert mit der Sitzungs-ID identisch sein.

Wenn Sie diesen Befehl in einer anderen Shell ausführen (wie der Shell, die in einem untergeordneten Prozess ausgeführt wird, um Ihre testing script), jede Shell, die kein Session-Leader ist, erhalten Sie nichts, weil es keine Session mit einer ID gibt, die der PID dieser Shell entspricht.

$ 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

$$ ist 7239, der Sitzungsleiter. Also ps -j -s 7239 gibt mir alle Prozesse in dieser Sitzung.

$ 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

Das erste ps Der Befehl gibt nichts zurück, da der zweite ps zeigt, gibt es keine Sitzung mit der ID 21044, da der Prozess der ID 21044 kein Sitzungsleiter ist. Der Sitzungsleiter ist immer noch 7239, die vom Terminal-Emulator gestartete Shell.

$ 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

Jetzt sehen wir alle Prozesse in der Sitzung. Wir haben ps -o sid= -p "$$" verwendet um die ID der Sitzung zu erhalten, die $$ gehört.

Verwandte:Testen Sie, ob es Dateien gibt, die einem Muster entsprechen, um ein Skript auszuführen?
Linux
  1. Zeitüberschreitung in einem Shell-Skript?

  2. Wie überprüfe ich, ob eine Shell angemeldet/interaktiv/Batch ist?

  3. Unerwartetes Verhalten eines Shell-Skripts?

  4. Shell-Skript zum Drucken der Sternenpyramide

  5. Kann eine .sh-Datei Malware sein?

So verwenden Sie Variablen in Shell-Skripten

So erstellen Sie Shell-Skripte

Bestimmen des Pfads zum bezogenen Shell-Skript?

Wie behandelt man Schalter in einem Shell-Skript?

Die Bedeutung von $? In einem Shell-Skript?

Wie führe ich einen Befehl in einem Shell-Skript aus?