Vzhledem k tomu, že nemám povoleno upravovat Jaucovu odpověď, poskytnu úplnou odpověď, která pro mě fungovala (Russellova stránka spoléhá na nezaručené chování, že pokud zavřete deskriptor souboru 1 pro STDOUT, další 07 hovor otevře FD 1.
Spusťte tedy jednoduchý nekonečný skript, jako je tento:
import time
while True:
print 'test'
time.sleep(1)
Uložte jej do souboru test.py, spusťte pomocí
$ python test.py
Získejte PID:
$ ps auxw | grep test.py
Nyní připojte 19
:
$ gdb -p (pid)
a proveďte 26
magie:
(gdb) call creat("/tmp/stdout", 0600)
$1 = 3
(gdb) call dup2(3, 1)
$2 = 1
Nyní můžete 36
a podívejte se na výstup, který dříve šel do STDOUT.
Existuje několik nových nástrojů, které zabalují "metodu gdb" a přidávají některé další úpravy. Ten, který nyní používám, se nazývá "reptyr" ("Re-PTY-er"). Kromě uchopení STDERR/STDOUT ve skutečnosti změní řídicí terminál procesu (i když předtím nebyl připojen k terminálu).
Nejlepší použití je spustit relaci obrazovky a použít ji k opětovnému připojení běžícího procesu k terminálu na obrazovce, abyste se od něj mohli bezpečně odpojit a vrátit se později.
Je zabalen v populárních distribucích (např. 'apt-get install reptyr').
http://onethingwell.org/post/2924103615/reptyr