Tengo una bashinstancia de larga ejecución (dentro de una screensesión) que está ejecutando un conjunto complejo de comandos dentro de un bucle (con cada bucle haciendo canalizaciones, redireccionamientos, etc.).
La larga línea de comando se escribió dentro del terminal; no está dentro de ningún script. Ahora, conozco el ID del proceso bash y tengo acceso a la raíz: ¿cómo puedo ver la línea de comando exacta que se ejecuta dentro de eso bash?
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 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'
es posible?
EDITAR # 1
Agregar contraejemplos para algunas respuestas que tengo.
Sobre el uso de
cmdlineunder/proc/PID: eso no funciona, al menos no en mi escenario. Aquí hay un ejemplo simple:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; doneEn otro caparazón:
$ cat /proc/8909/cmdline bashUsar
ps -p PID --noheaders -o cmdes igual de inútil:$ ps -p 8909 --no-headers -o cmd bashps -eaftampoco 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 8909Es 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.

gdb:print (char *)rl_line_buffer. El comando actual en una secuencia esprint (char *)the_printed_command. También puedecall history_builtin(), pero eso se generará en el tty del proceso bash, por lo que podría ser menos útil.Como el comando todavía se está ejecutando en la pantalla, su bash principal no ha vuelto a leer ningún historial, por lo que:
^Zentoncesup arrow^A^A- porque pantalla (1) - y^E) y echo + redirigir a un archivofgperseguir la ejecución del comandoHay advertencias, pero esto es bastante útil, la mayoría de las veces.
fuente
up. Aunque debe estar seguro de que comenzará nuevamente sin ningún problema, pero si no lo hace, tendría el mismo problema después de un reinicio de todos modos. Solo tiene que elegir su momento cuando un tiempo de inactividad no sería un problema.Sé que encontraste tu propia respuesta, pero hay una razón por la que no puedes hacer algo como esto:
Quizás no pueda mezclar la salida del trabajo real y la salida de bash que muestra la línea que se está ejecutando actualmente.
Además, pedía algo, si lo prefiere la verbosidad,
set -o xtrace.fuente