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í
cmdline
pod/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 ; done
V jiném prostředí:
$ cat /proc/8909/cmdline bash
-
Pomocí
ps -p PID --noheaders -o cmd
je stejně k ničemu:$ ps -p 8909 --no-headers -o cmd bash
-
ps -eaf
také 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 8909
To 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.