Mám dlouho spuštěný bash instance (uvnitř screen session), která provádí složitou sadu příkazů uvnitř smyčky (přičemž každá smyčka provádí roury, přesměrování atd.).
Dlouhý příkazový řádek byl napsán uvnitř terminálu – není v žádném skriptu. Nyní znám ID procesu bash a mám přístup root – jak mohu vidět přesný příkazový řádek spouštěný uvnitř toho bash ?
Příklad
bash$ echo $$
1234
bash$ while true ; do
someThing | somethingElse 2>/foo/bar |
yetAnother ; sleep 600 ; done
A v další instanci shellu chci vidět příkazový řádek spuštěný uvnitř 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'
Je to možné?
UPRAVIT #1
Přidám protipříklady pro některé odpovědi, které mám.
-
O použití
cmdlinepod/proc/PID:To nefunguje, alespoň ne v mém scénáři. Zde je jednoduchý příklad:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; doneV jiném prostředí:
$ cat /proc/8909/cmdline bash -
Pomocí
ps -p PID --noheaders -o cmdje stejně k ničemu:$ ps -p 8909 --no-headers -o cmd bash -
ps -eaftaké není užitečné:$ 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 8909To znamená, že neexistuje žádný výstup příkazového řádku ORIGINAL, což je to, co hledám – tj.
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done.
Přijatá odpověď:
Věděl jsem, že se chytám stébla, ale UNIX nikdy neselže!
Zvládl jsem to takto:
bash$ gdb --pid 8909
...
Loaded symbols for /lib/i386-linux-gnu/i686/cmov/libnss_files.so.2
0xb76e7424 in __kernel_vsyscall ()
Poté na (gdb) Spustil jsem příkaz call write_history("/tmp/foo") který zapíše tuto historii do souboru /tmp/foo .
(gdb) call write_history("/tmp/foo")
$1 = 0
Poté se od procesu odpojím.
(gdb) detach
Detaching from program: /bin/bash, process 8909
A ukončete gdb .
(gdb) q
A jistě…
bash$ tail -1 /tmp/foo
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Pro snadné budoucí opětovné použití jsem napsal bash skript, který proces automatizuje.