GNU/Linux >> Znalost Linux >  >> Linux

Jak přesměrovat výstup již běžícího procesu

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 provedu close() systémové volání a předání souboru handle 1, pak provedu creat() systémové volání pro otevření nového souboru. Výsledek creat() 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 zavolat dup2() systémové volání k dosažení tohoto výsledku.

Pro tento příklad jsem se rozhodl použít creat() místo open() 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).


Linux
  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Jak změnit přesměrování výstupu běžícího procesu?

  3. Jak zobrazit výstup běžícího procesu v jiné relaci Bash?

  1. Jak přesměrovat výstup programu do souboru ZIP?

  2. Jak zkontrolovat průběh běhu Cp?

  3. Zabránit již běžícímu procesu zápisu do existujícího souboru?

  1. Jak přesměrovat výstup do souboru a stdout

  2. Jak přesměrovat výstup system() do souboru?

  3. Jak přesměrovat celý výstup spark-submit do souboru