GNU/Linux >> Linux Esercitazione >  >> Linux

Come può un processo intercettare stdout e stderr di un altro processo su Linux?

Poiché non sono autorizzato a modificare la risposta di Jauco, fornirò la risposta completa che ha funzionato per me (la pagina di Russell si basa su un comportamento non garantito che, se chiudi il descrittore di file 1 per STDOUT, il successivo creat la chiamata aprirà FD 1.

Quindi, esegui un semplice script infinito come questo:

import time

while True:
    print 'test'
    time.sleep(1)

Salvalo in test.py, eseguilo con

$ python test.py

Ottieni il PID:

$ ps auxw | grep test.py

Ora allega gdb :

$ gdb -p (pid)

e fai il fd magia:

(gdb) call creat("/tmp/stdout", 0600)
$1 = 3
(gdb) call dup2(3, 1)
$2 = 1

Ora puoi tail /tmp/stdout e guarda l'output che prima andava a STDOUT.


Sono disponibili diverse nuove utilità che completano il "metodo gdb" e aggiungono alcuni tocchi extra. Quello che uso ora si chiama "reptyr" ("Re-PTY-er"). Oltre ad acquisire STDERR/STDOUT, cambierà effettivamente il terminale di controllo di un processo (anche se non era precedentemente collegato a un terminale).

Il miglior utilizzo di questo è avviare una sessione dello schermo e utilizzarla per ricollegare un processo in esecuzione al terminale all'interno dello schermo in modo da potersi staccare in sicurezza da esso e tornare più tardi.

È impacchettato su distribuzioni popolari (Es:'apt-get install reptyr').

http://onethingwell.org/post/2924103615/reptyr


Linux
  1. Come avviare il comando Linux in background e scollegare il processo nel terminale

  2. Come copiare le autorizzazioni e la proprietà dei file su un altro file in Linux

  3. Quanto sono portatili /dev/stdin, /dev/stdout e /dev/stderr?

  4. Come installare e configurare Monit su Linux per il monitoraggio dei processi

  5. Come posso sapere in Linux quale processo ha inviato un segnale al mio processo

Come uccidere un processo in Linux

Come sospendere un processo e riprenderlo in un secondo momento in Linux

Come lavorare con il processo in primo piano e in background in Linux

Come trovare il PID e il PPID di un processo in Linux

Come uccidere i processi in Linux usando kill, killall e pkill

Come tracciare e tracciare un processo Linux