GNU/Linux >> Znalost Linux >  >> Linux

Jak může proces zachytit stdout a stderr jiného procesu v Linuxu?

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


Linux
  1. Jak spustit příkaz Linux na pozadí a odpojit proces v terminálu

  2. Jak najít a zabít zombie proces v Linuxu

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

  1. Jak zkopírovat oprávnění a vlastnictví souboru do jiného souboru v Linuxu

  2. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  3. Jak mohu nastavit afinitu procesoru k procesu v systému Linux?

  1. Jak nastavit prioritu procesu Linux pomocí příkazů nice a renice

  2. Jak nainstalovat a nakonfigurovat Monit na Linuxu pro monitorování procesů

  3. Jak mohu v Linuxu zjistit, který proces poslal mému procesu signál