2013-01-06 18 views
10

Ho un processo in esecuzione in background (sh script) e mi chiedo se è possibile visualizzare l'output di questo processo senza doverlo interrompere.visualizza l'output dei processi già in esecuzione in linux

Il processo è stato eseguito da alcune applicazioni altrimenti l'avrei collegato a uno schermo per una successiva visualizzazione. Potrebbe volerci un'ora per finire e voglio assicurarmi che funzioni normalmente senza errori.

+2

Che tipo di output è? È semplice testo? Se è così, puoi semplicemente usare "tail -f ". La coda ottiene la fine del file, la bandiera -f dice di "seguire" il file. Ci sono altre opzioni per il comando tail per specificare quante linee e penso per quanto tempo aspettare tra il polling del file. – Mike

+0

Il problema è che non ho avviato questo processo è iniziato da alcune applicazioni che il provider ha lanciato (programma di installazione cpanel) e no non hanno reindirizzato l'output a nessun file altrimenti avrei semplicemente usato tail come suggerivi, che in mente è c'è un modo per visualizzare l'output? –

risposta

4

C'è già un programma che utilizza ptrace (2) in linux per fare questo, retty:

http://pasky.or.cz/dev/retty/

Funziona se il programma in esecuzione è già collegato a un tty, non lo faccio sapere se funzionerà se si esegue il programma in background.

Almeno può dare qualche buon suggerimento. :)

È possibile recuperare il codice di uscita dal programma utilizzando ptrace(2), altrimenti allegare al processo utilizzando gdb -p <pid> e verrà stampato quando il programma muore.

È possibile anche manipolare descrittori di file utilizzando gdb:

(gdb) p close(1) 
$1 = 0 
(gdb) p creat("/tmp/stdout", 0600) 
$2 = 1 

http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

1

Si potrebbe provare ad agganciare il triplo /proc/[pid]/fd/[012], ma probabilmente non funzionerà.

L'idea successiva che mi viene in mente è strace -p [pid], ma si otterrà l'output "prittifiato". La soluzione possibile è di stracciarti scrivendo un piccolo programma usando ptrace(2) per collegarlo a write(2) e scrivendo i dati da qualche parte. It funzionerà ma non viene eseguito in pochi secondi, soprattutto se non si è abituati alla programmazione in C.

Purtroppo non riesco a pensare a un programma che faccia esattamente quello che vuoi, ed è per questo che ti do un suggerimento su come scriverlo da solo. In bocca al lupo!