GNU/Linux >> Linux Esercitazione >  >> Linux

Come vedere l'esatta riga di comando eseguita all'interno di alcune istanze Bash?

Ho un bash di lunga durata istanza (all'interno di uno screen sessione) che sta eseguendo un insieme complesso di comandi all'interno di un ciclo (con ogni ciclo che esegue pipe, reindirizzamenti, ecc.).

La lunga riga di comando è stata scritta all'interno del terminale:non è all'interno di nessuno script. Ora, conosco l'ID del processo bash e ho l'accesso come root:come posso vedere l'esatta riga di comando eseguita all'interno di quel bash ?

Esempio

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

E in un'altra istanza della shell, voglio vedere la riga di comando eseguita all'interno del 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'

È possibile?

EDIT #1

Aggiunta di controesempi per alcune risposte che ho.

  1. Informazioni sull'utilizzo di cmdline sotto /proc/PID :non funziona, almeno non nel mio scenario. Ecco un semplice esempio:

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

    In un'altra shell:

    $ cat /proc/8909/cmdline
    bash
    
  2. Utilizzo di ps -p PID --noheaders -o cmd è altrettanto inutile:

    $ ps -p 8909 --no-headers -o cmd
    bash
    
  3. ps -eaf inoltre non è utile:

    $ 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
    

    Cioè, non c'è output della riga di comando ORIGINAL, che è quello che sto cercando, ovvero il while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done .

Risposta accettata:

Sapevo che stavo afferrando le cannucce, ma UNIX non fallisce mai!

Ecco come ci sono riuscito:

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

Quindi al (gdb) prompt Ho eseguito il comando, call write_history("/tmp/foo") che scriverà questa cronologia nel file /tmp/foo .

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

Quindi mi stacco dal processo.

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

Ed esci da gdb .

(gdb) q

E abbastanza sicuro...

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

Per un facile riutilizzo futuro, ho scritto uno script bash, automatizzando il processo.


Linux
  1. Suggerimenti Bash per tutti i giorni dalla riga di comando

  2. Bash Echo La riga di comando eseguita sulla riga di comando stessa (non in uno script)?

  3. Come riavviare Icewm dalla riga di comando?

  4. Come fare eco a una nuova riga negli script di Bash Shell

  5. Come faccio a inviare e-mail dalla riga di comando?

Come utilizzare il comando di lettura Bash

Come creare un'istanza in OpenStack tramite riga di comando

Come visualizzare la cronologia di Bash senza numeri di riga

Come utilizzare il comando echo negli script Bash in Linux

Come inserire una nuova riga nell'e-mail usando il comando linux mail?

Come posso modificare le righe precedenti in un comando a più righe in Bash?