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.
-
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
-
Utilizzo di
ps -p PID --noheaders -o cmd
è altrettanto inutile:$ ps -p 8909 --no-headers -o cmd bash
-
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.