Viz Přesměrování výstupu z běžícího procesu .
Nejprve spustím příkaz
cat > foo1
v jedné relaci a otestujte, zda se data z stdin zkopírují do souboru. Pak v další relaci přesměruji výstup.Nejprve najděte PID procesu:
$ ps aux | grep cat rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat
Nyní zkontrolujte popisovače souborů, které má otevřené:
$ ls -l /proc/6760/fd total 3 lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1 lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5
Nyní spusťte GDB:
$ gdb -p 6760 /bin/cat GNU gdb 6.4.90-debian [license stuff snipped] Attaching to program: /bin/cat, process 6760 [snip other stuff that's not interesting now] (gdb) p close(1) $1 = 0 (gdb) p creat("/tmp/foo3", 0600) $2 = 1 (gdb) q The program is running. Quit anyway (and detach it)? (y or n) y Detaching from program: /bin/cat, process 6760
p
příkaz v GDB vypíše hodnotu výrazu, výraz může být funkce k volání, může to být systémové volání… Takže proveduclose()
systémové volání a předání souboru handle 1, pak proveducreat()
systémové volání pro otevření nového souboru. Výsledekcreat()
byl 1, což znamená, že nahradil předchozí popisovač souboru. Pokud bych chtěl použít stejný soubor pro stdout a stderr nebo pokud bych chtěl nahradit popisovač souboru nějakým jiným číslem, musel bych zavolatdup2()
systémové volání k dosažení tohoto výsledku.Pro tento příklad jsem se rozhodl použít
creat()
místoopen()
protože je tam méně parametrů. C makra pro příznaky nejsou z GDB použitelná (nepoužívá hlavičky C), takže bych musel číst hlavičkové soubory, abych to zjistil – není to tak těžké, ale zabralo by to více času. Všimněte si, že 0600 je osmičkové oprávnění pro vlastníka s přístupem pro čtení/zápis a pro skupinu a ostatní, kteří nemají přístup. Fungovalo by také použití 0 pro tento parametr a spuštění chmod na souboru později.Poté ověřím výsledek:
ls -l /proc/6760/fd/ total 3 lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <==== lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5
Zadejte další data do
cat
výsledkem je soubor/tmp/foo3
připojuje se k.Pokud chcete zavřít původní relaci, musíte pro ni zavřít všechny popisovače souborů, otevřít nové zařízení, které může být řídícím tty, a poté zavolat
setsid()
.
Můžete to udělat také pomocí reredirect
(https://github.com/jerome-pouiller/reredirect/).
Níže uvedený příkaz přesměruje výstupy (standardní a chybové) procesu PID
na FILE
:
reredirect -m FILE PID
README
z reredirect
také vysvětluje další zajímavé funkce:jak obnovit původní stav procesu, jak přesměrovat na jiný příkaz nebo přesměrovat pouze stdout nebo stderr.
Nástroj také poskytuje relink
, skript umožňující přesměrování výstupů na aktuální terminál:
relink PID
relink PID | grep usefull_content
(reredirect
Zdá se, že má stejné funkce než Dupx popsané v jiné odpovědi, ale nezávisí to na Gdb).