GNU/Linux >> Znalost Linux >  >> Linux

Jak vidět, že se přesný příkazový řádek spouští uvnitř některé instance Bash?

Mám dlouho spuštěný bash instance (uvnitř screen session), která provádí složitou sadu příkazů uvnitř smyčky (přičemž každá smyčka provádí roury, přesměrování atd.).

Dlouhý příkazový řádek byl napsán uvnitř terminálu – není v žádném skriptu. Nyní znám ID procesu bash a mám přístup root – jak mohu vidět přesný příkazový řádek spouštěný uvnitř toho bash ?

Příklad

bash$ echo $$
1234
bash$ while true ; do 
    someThing | somethingElse 2>/foo/bar | 
    yetAnother ; sleep 600 ; done

A v další instanci shellu chci vidět příkazový řádek spuštěný uvnitř PID 1234:

bash$ echo $$
5678
bash$ su -
sh# cd /proc/1234
sh# # Do something here that will display the string  
   'while true ; do someThing | somethingElse 2>/foo/bar | 
    yetAnother ; sleep 600 ; done'

Je to možné?

UPRAVIT #1

Přidám protipříklady pro některé odpovědi, které mám.

  1. O použití cmdline pod /proc/PID :To nefunguje, alespoň ne v mém scénáři. Zde je jednoduchý příklad:

    $ echo $$
    8909
    
    $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
    

    V jiném prostředí:

    $ cat /proc/8909/cmdline
    bash
    
  2. Pomocí ps -p PID --noheaders -o cmd je stejně k ničemu:

    $ ps -p 8909 --no-headers -o cmd
    bash
    
  3. ps -eaf také není užitečné:

    $ ps -eaf | grep 8909
    ttsiod    8909  8905  0 10:09 pts/0    00:00:00 bash
    ttsiod   30697  8909  0 10:22 pts/0    00:00:00 sleep 30
    ttsiod   31292 13928  0 10:23 pts/12   00:00:00 grep --color=auto 8909
    

    To znamená, že neexistuje žádný výstup příkazového řádku ORIGINAL, což je to, co hledám – tj. while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done .

Přijatá odpověď:

Věděl jsem, že se chytám stébla, ale UNIX nikdy neselže!

Zvládl jsem to takto:

bash$ gdb --pid 8909
...
Loaded symbols for /lib/i386-linux-gnu/i686/cmov/libnss_files.so.2
0xb76e7424 in __kernel_vsyscall ()

Poté na (gdb) Spustil jsem příkaz call write_history("/tmp/foo") který zapíše tuto historii do souboru /tmp/foo .

(gdb) call write_history("/tmp/foo")
$1 = 0

Poté se od procesu odpojím.

(gdb) detach
Detaching from program: /bin/bash, process 8909

A ukončete gdb .

(gdb) q

A jistě…

bash$ tail -1 /tmp/foo
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done

Pro snadné budoucí opětovné použití jsem napsal bash skript, který proces automatizuje.


Linux
  1. Bash tipy pro každý den na příkazovém řádku

  2. Jak získám svou IP adresu z příkazového řádku?

  3. Bash Loop - Jak zastavit smyčku, když stisknu Control-C uvnitř příkazu?

  1. Jak vymazat historii příkazového řádku BASH v Linuxu

  2. Bash Echo Příkazový řádek spuštěn na samotném příkazovém řádku (ne ve skriptu)?

  3. Jak restartovat Icewm z příkazového řádku?

  1. Jak zopakovat nový řádek ve skriptech Bash Shell

  2. Jak mohu odeslat e-mail z příkazového řádku?

  3. Jak přidat ikonu do výzvy bash