Tengo una bash
instancia de larga ejecución (dentro de una screen
sesió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
cmdline
under/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 ; done
En otro caparazón:
$ cat /proc/8909/cmdline bash
Usar
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
.
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:
^Z
entoncesup arrow
^A^A
- porque pantalla (1) - y^E
) y echo + redirigir a un archivofg
perseguir 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