Collega a un output dei processi per la visualizzazione


111

Come dovrei "collegare" una console / visualizzazione del terminale all'output di un'applicazione in modo da poter vedere cosa potrebbe dire?

Come faccio a scollegarmi dall'output di un'applicazione senza uccidere l'applicazione?

Normalmente, se avvii un'applicazione loquace usando la riga di comando, puoi vedere tutti i tipi di risultati meravigliosi. Tuttavia, diciamo che ho una programmazione particolarmente loquace in esecuzione, come KINO, e voglio visualizzare il suo output in un dato momento senza riavviarlo tramite la riga di comando. Non posso; almeno non so come.


1
Hai un simbolo di debug nel tuo processo? Funziona in ambiente di produzione? E se sì, hai bisogno che non venga MAI messo in pausa?
yves Baumes

Quando ho problemi di stabilità con programmi per utenti finali come kino (si blocca e uccide il mio suono), voglio essere in grado di sapere come / perché si è bloccato in modo da poter lavorare per risolverlo. Questo non è un programma che sto sviluppando, ma una tecnica che vorrei conoscere per la risoluzione dei problemi. Proverò il tuo suggerimento di seguito.
aggitan

Risposte:


17

Ci sono alcune opzioni qui. Uno è reindirizzare l'output del comando a un file, quindi utilizzare "tail" per visualizzare le nuove righe che vengono aggiunte a quel file in tempo reale.

Un'altra opzione è avviare il programma all'interno di "screen", che è una sorta di applicazione Terminale basata su testo. Le sessioni dello schermo possono essere collegate e scollegate, ma sono nominalmente pensate solo per essere utilizzate dallo stesso utente, quindi se vuoi condividerle tra gli utenti, è un grosso rompicoglioni.


1
"Ci sono alcune opzioni qui. Una è reindirizzare l'output del comando a un file, quindi utilizzare 'tail' per visualizzare le nuove righe che vengono aggiunte a quel file in tempo reale." È possibile farlo con applicazioni già in esecuzione?
aggitan

2
Probabilmente avrai bisogno di tail -f $ log_file per ottenere l'output così come è scritto nel file. Inoltre, no, non c'è modo che io sappia farlo con un'app già in esecuzione.
Varkhan

@aggitan: No. Per le applicazioni esistenti, dovrai riavviarle, perché hanno già associato il loro I / O al terminale di controllo.
Don Werve,


287

Penso di avere una soluzione più semplice qui. Cerca una directory il cui nome corrisponda al PID che stai cercando, sotto lo pseudo-filesystem accessibile sotto il /procpercorso. Quindi, se hai un programma in esecuzione, il cui ID è 1199, cdin esso:

$ cd /proc/1199

Quindi cerca la fddirectory sottostante

$ cd fd

Questa fddirectory contiene gli oggetti descrittori di file che il tuo programma sta usando (0: stdin, 1: stdout, 2: stderr) e solo tail -fquello che ti serve - in questo caso, stdout):

$ tail -f 1

9
Non sono stato in grado di utilizzare tailpoiché nel mio caso l'output è stato reindirizzato a un altro processo per l'input, ma moremi ha mostrato i dati correnti.
Ωmega

10
Uno dei post più avvincenti su questo sito!
robert

2
moresta lavorando per me. ubuntu 14.04 su un processo di nodo
Shih-Min Lee

1
Questo non funziona per me con un processo java che chiama System.out.println. Non c'è alcun output in / proc / [pid] / fd / 1
Nick

1
Ho provato a creare una riproduzione usando quanto segue, ma senza alcun risultato: `` `` docker run -it --name container1 ubuntu bash -c -i "COUNT = 0; while true; do echo Mantieni il ritmo della pista da ballo in movimento; (( COUNT ++)); sleep 1; echo \ "Il conteggio è: \ $ {COUNT} \"; done; " `` In un altro terminale: `` docker exec -it container1 tail -f / proc / 1 / fd / 1 `` ''
JacobWuzHere

54

Stavo cercando esattamente la stessa cosa e ho scoperto che puoi fare:

strace -ewrite -p $PID

Non è esattamente ciò di cui avevi bisogno, ma è abbastanza vicino.

Ho provato l'output di reindirizzamento, ma non ha funzionato per me. Forse perché il processo stava scrivendo su un socket, non lo so.


grazie funziona, ma l'output è troncato, ad esempio per ping: write (1, "64 bytes from 1.0.0.1: icmp_seq =" ..., 56) = 56
izy

8

Come dovrei "collegare" una console / visualizzazione del terminale all'output di un'applicazione in modo da poter vedere cosa potrebbe dire?

A proposito di questa domanda, so che è possibile catturare l'output, anche quando non hai avviato il comando sceen prima di avviare il processus.

Anche se non l'ho mai provato, ho trovato un articolo interessante che spiega come utilizzare GDB (e senza riavviare il processo).

reindirizzamento-output-da-un-running-process

Fondamentalmente:

  1. Controlla l'elenco dei file aperti per il tuo processo, grazie a / proc / xxx / fd
  2. Collega il tuo processo con GDB
  3. Mentre è in pausa, chiudi il file che ti interessa, chiamando la funzione close () (puoi qualsiasi funzione del tuo processo in GDB. Sospetto che tu abbia bisogno di simboli di debug nel tuo processo ..)
  4. Apri un nuovo file chiamando la funzione create () o open (). (Dai un'occhiata ai commenti alla fine, vedrai che le persone suggeriscono di usare dup2 () per assicurarti che sia in uso lo stesso handle)
  5. Stacca il processo e lascia che entri in esecuzione.

A proposito, se stai utilizzando un sistema operativo Linux su un box i386, i commenti parlano di uno strumento migliore per reindirizzare l'output su una nuova console: "retty" . Se è così, considera il suo utilizzo.


6

Per me, questo ha funzionato:

  1. Accedi come proprietario del processo (anche se rootviene negato il permesso)

    ~$ su - process_owner
    
  2. Coda il descrittore di file come menzionato in molte altre risposte.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    

2

Volevo guardare in remoto un processo di aggiornamento yum che era stato eseguito localmente, quindi anche se probabilmente c'erano modi più efficienti per farlo, ecco cosa ho fatto:

watch cat /dev/vcsa1

Ovviamente vorresti usare vcsa2, vcsa3, ecc., A seconda del terminale in uso.

Finché la mia finestra del terminale era della stessa larghezza del terminale su cui veniva eseguito il comando, potevo vedere un'istantanea del loro output corrente ogni due secondi. Gli altri comandi consigliati altrove non funzionavano particolarmente bene per la mia situazione, ma quello ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.