Tengo un bash
de larga duración instancia (dentro de una screen
sesión) que está ejecutando un conjunto complejo de comandos dentro de un ciclo (con cada ciclo haciendo canalizaciones, redireccionamientos, etc.).
La línea de comando larga se escribió dentro de la terminal, no está dentro de ningún script. Ahora, conozco el ID del proceso bash y tengo acceso de root. ¿Cómo puedo ver la línea de comando exacta que se ejecuta dentro de ese bash
? ?
Ejemplo
bash$ echo $$
1234
bash$ while true ; do
someThing | somethingElse 2>/foo/bar |
yetAnother ; sleep 600 ; done
Y en otra instancia de shell, quiero ver la línea de comando ejecutada dentro de 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'
¿Es esto posible?
EDITAR #1
Agregar contraejemplos para algunas respuestas que tengo.
-
Acerca del uso de
cmdline
en/proc/PID
:eso no funciona, al menos no en mi escenario. He aquí un ejemplo simple:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
En otro caparazón:
$ cat /proc/8909/cmdline bash
-
Usando
ps -p PID --noheaders -o cmd
es igual de inútil:$ ps -p 8909 --no-headers -o cmd bash
-
ps -eaf
tampoco es útil:$ 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
Es decir, no hay salida de la línea de comando ORIGINAL, que es lo que estoy buscando, es decir, el
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.
Respuesta aceptada:
Sabía que me estaba aferrando a un clavo ardiendo, ¡pero UNIX nunca falla!
Así es como lo logré:
bash$ gdb --pid 8909
...
Loaded symbols for /lib/i386-linux-gnu/i686/cmov/libnss_files.so.2
0xb76e7424 in __kernel_vsyscall ()
Luego en el (gdb)
mensaje Ejecuté el comando, call write_history("/tmp/foo")
que escribirá este historial en el archivo /tmp/foo
.
(gdb) call write_history("/tmp/foo")
$1 = 0
Luego me separo del proceso.
(gdb) detach
Detaching from program: /bin/bash, process 8909
Y sal de gdb
.
(gdb) q
Y por supuesto...
bash$ tail -1 /tmp/foo
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Para una reutilización fácil en el futuro, escribí un script bash, automatizando el proceso.