GNU/Linux >> Znalost Linux >  >> Linux

Procesy v relaci v interaktivním prostředí versus ve skriptu?

Pokud tento příkaz spustím ve skriptu, neprodukuje výstup kromě záhlaví z ps :

 # Taken from Advanced Bash Usage on youtube:

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

Toto je výstup:

$./testing.bash
  PID TTY      STAT   TIME COMMAND

ale zde se spouští v terminálu, který produkuje očekávaný výstup :

$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

OTÁZKA:

Můžete mi vysvětlit rozdíl a ukázat mi správný způsob, jak toho dosáhnout?

Vyzkoušel jsem spoustu věcí a hledal jsem na Googlu 4 hodiny, pokud potřebujete, mohu uvést, co jsem zkoušel, ale nemyslím si, že je to zde relevantní.

$echo $SHELL
/bin/bash

a:

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

Přijatá odpověď:

ps-s sessionid možností je vybrat procesy na základě jejich ID relace.

Můžete použít ps -j abyste viděli ID relace procesů. Relace spolu se skupinami procesů se obecně používají pro řízení úloh shellu (proto -j ).

Váš terminálový emulátor vytvoří novou relaci s procesem, který pak znovu použije k provedení vašeho preferovaného shellu. Takže v terminálu bude ID relace obecně stejné jako pid tohoto shellu.

Pokud tedy spustíte ps -j -s "$$" v tom shell, získáte procesy v relaci, protože "$$" stane se být stejný jako ID relace.

Pokud tento příkaz spustíte v jakémkoli jiném shellu (jako je shell, který je spuštěn v podřízeném procesu k interpretaci vašeho testing script), jakýkoli shell, který není vůdcem relace, nezískáte nic, protože neexistuje žádná relace s ID, které by odpovídalo pid tohoto shellu.

$ 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

$$ je 7239, vedoucí relace. Takže ps -j -s 7239 mi poskytuje všechny procesy v této relaci.

$ 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

První ps příkaz nevrací nic, protože jako druhý ps ukazuje, neexistuje žádná relace s id 21044, protože proces id 21044 není vedoucí relace. Vedoucí relace je stále 7239, shell spuštěný emulátorem terminálu.

$ 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

Nyní vidíme všechny procesy v relaci. Použili jsme ps -o sid= -p "$$" získat ID relace, která $$ patří.

Související:Otestovat, zda existují soubory odpovídající vzoru, aby bylo možné spustit skript?
Linux
  1. Určit prostředí ve skriptu za běhu?

  2. Určení cesty ke zdrojovému skriptu Shell?

  3. Jak zacházet s přepínači ve skriptu Shell?

  1. Shell Script pro tisk pyramidy hvězd

  2. Aktuální adresář skriptu Shell?

  3. Transliterační skript pro linuxové prostředí

  1. Časový limit ve skriptu Shell?

  2. Jak zkontrolovat, zda je Shell přihlašovací/interaktivní/dávkový?

  3. Může být soubor .sh malware?