GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo ver la línea de comando exacta que se ejecuta dentro de alguna instancia de Bash?

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.

  1. 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
    
  2. Usando ps -p PID --noheaders -o cmd es igual de inútil:

    $ ps -p 8909 --no-headers -o cmd
    bash
    
  3. 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.


Linux
  1. Consejos de Bash para el día a día en la línea de comandos

  2. Cómo borrar el historial de línea de comandos BASH en Linux

  3. Cómo crear una base de datos en MySQL usando la línea de comandos

  4. Bash Echo ¿La línea de comando se ejecutó en la propia línea de comando (no en un script)?

  5. ¿Cómo reiniciar Icewm desde la línea de comandos?

Cómo usar el comando de lectura Bash

Cómo crear una instancia en OpenStack a través de la línea de comandos

Cómo mostrar el historial de Bash sin números de línea

Cómo usar el comando echo en Bash Scripts en Linux

¿Cómo insertar una nueva línea en el correo electrónico usando el comando de correo de Linux?

¿Cómo edito líneas anteriores en un comando de varias líneas en Bash?