È possibile leggere l'output di qualsiasi processo usando il suo PID?


32

È possibile collegare un terminale a un processo già in esecuzione utilizzando il suo PID in modo simile all'utilizzo del fgcomando per i lavori?


tipo cosa?! qual è il processo che vuoi allegare ?!

Vorrei poter vedere l'output di un programma avviato in un altro terminale
Tommy,

Risposte:


43

È possibile ottenere i descrittori di file standard di tale processo, ad esempio stdout:

tail -f /proc/<pid>/fd/1

8
Ho provato questa soluzione con top e non sembra funzionare. In un terminale ho lanciato top e in un altro ho usato il tuo comando con il pid corretto ma non ho ottenuto output.
Tommy,

1
Come si fa su un Mac?
Avner Barr,

che dire di stderr? Presumo / proc / <pid> / fd / 2, ma come si ottengono entrambi stdout / stderr?
Alexander Mills,

1
Cosa succede se questo descrittore punta a un socket? La coda non riesce a leggerlo. # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Imaskar dice di reintegrare Monica il

8

Ci sono alcune opzioni qui. Uno è di reindirizzare l'output del comando su un file, quindi utilizzare tailper visualizzare le nuove linee che vengono aggiunte a quel file in tempo reale.

Un'altra opzione è quella di avviare il programma all'interno di screen, che è una sorta di applicazione terminale testuale. Le sessioni dello schermo possono essere collegate e staccate, ma sono nominalmente pensate solo per essere utilizzate dallo stesso utente, quindi se si desidera condividerle tra utenti.

Altrimenti, se lo desideri, puoi tracciare il processo e vedere cosa sta facendo strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: Allegare al processo con l'ID processo PID e iniziare la traccia.
  • -s SIZE: Specifica la dimensione massima della stringa da stampare (il valore predefinito è 32).
  • -o filename: Scrivi l'output di traccia nel nome file del file anziché sullo schermo (stderr).

Finalmente non sembra funzionare. Ho lanciato top e in un altro ho usato il tuo comando con il pid corretto ma non ho ottenuto l'output previsto. Quando uso la coda dopo.
Tommy,

È necessario utilizzare sudocon strace per collegarsi a un processo e utilizzare in -o ~/output.txtmodo che il file venga lasciato nella cartella principale.

Usa il file di output, non inviare allo schermo! Non essere un idiota come me e premi Ctrl-C per uscire di scena e poi staccare il mio PID. Mi ha spaventato a morte con una sceneggiatura importante.
Weston Ganger,

3

È possibile utilizzare questi comandi indicati di seguito per collegare un processo in esecuzione su un altro terminale:

  • retty(Pagina man: retty )
  • reptyr
  • screen

Esempio:

screen -S PID
retty $(pgrep PID)
reptyr PID

Non sono riuscito a trovare meschinità o repulsione. Inoltre, per poter utilizzare lo schermo devo avviare il processo originale con esso in modo che non risolva il mio problema.
Tommy,

puoi installarlo usando il comando sudo apt-get install rettyma ci sono alcune limitazioni con retty. Dai un'occhiata alla pagina man menzionata nella risposta.
devav2,
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.