GNU/Linux >> Linux Esercitazione >  >> Linux

Perché non posso `tail -f /proc/$pid/fd/1`?

Crea un strace di tail -f , spiega tutto. La parte interessante:

13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 fstatfs(3, {...}) = 0
13791 inotify_init()                    = 4
13791 inotify_add_watch(4, "/path/to/file", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 read(4, 0xd981c0, 26)             = -1 EINTR (Interrupted system call)

Cosa fa? Imposta un inotify handler al file, quindi attende finché non accade qualcosa con questo file. Se il kernel dice tail attraverso questo gestore inotify, che il file è cambiato (normalmente, è stato aggiunto), quindi tail 1) cerca 2) legge le modifiche 3) le scrive sullo schermo.

/proc/3844/fd/1 sul tuo sistema c'è un collegamento simbolico a /dev/pts/14 , che è un dispositivo di carattere. Non esiste qualcosa come una "mappa della memoria", a cui è possibile accedere da quella. Pertanto, non c'è nulla le cui modifiche possano essere firmate dall'inotify, perché non esiste un disco o un'area di memoria a cui si possa accedere.

Questo dispositivo a caratteri è un terminale virtuale, che funziona praticamente come se fosse una presa di rete. I programmi in esecuzione su questo terminale virtuale si connettono a questo dispositivo (proprio come se si collegasse telnet a una porta tcp) e scrivono ciò in cui vogliono scrivere. Ci sono anche cose più complesse, ad esempio il blocco dello schermo, le sequenze di controllo del terminale e simili, queste sono normalmente gestite da ioctl() chiamate.

Penso che tu voglia in qualche modo guardare un terminale virtuale. Può essere fatto su Linux, ma non è così semplice, richiede alcune funzionalità simili a proxy di rete e un po' di uso complicato di questi ioctl() chiamate. Ma ci sono strumenti che possono farlo.

Al momento non riesco a ricordare quale pacchetto debian abbia lo strumento per questo obiettivo, ma con un po' di ricerca su google potresti trovarlo probabilmente facilmente.

Estensione: come ha menzionato @Jajesh qui (dagli un +1 se mi hai dato), lo strumento si chiama watch .

Estensione n. 2: @kelnos menzionato, un semplice cat /dev/pts/14 erano anche sufficienti. L'ho provato e sì, ha funzionato, ma non correttamente. Non ho sperimentato molto con questo, ma mi sembra che un output che entra in quel terminale virtuale sia andato neanche al cat comando, o nella sua posizione originale, e mai in entrambi. Ma non è sicuro.


File in /dev/pts non sono file regolari, sono handle per terminali virtuali.A pts il comportamento per la lettura e la scrittura non è simmetrico (ovvero, ciò che è scritto lì può essere successivamente letto da esso, come un normale file o un fifo/pipe), ma mediato dal processo che ha creato il terminale virtuale:alcuni comuni sono xterm o ssh o agetty o screen. Il processo di controllo di solito invia le pressioni dei tasti ai processi che leggono il pts file e visualizzano sullo schermo ciò che scrivono su pts .

Quindi, tail -f /dev/pts/14 stamperà i tasti che tocchi sul terminale da cui hai avviato lo script, e se fai echo meh > /dev/pts/14 il meh messaggio apparirà nel terminale.


Linux
  1. /proc/[pid]/pagemaps e /proc/[pid]/maps | Linux

  2. Quando dovrei usare /dev/shm/ e quando dovrei usare /tmp/?

  3. Come scoprire da quale cartella è in esecuzione un processo?

  4. Perché non riesco a scorrere nel terminale?

  5. Perché mettere cose diverse da /home in una partizione separata?

Linux – Collegamento di /proc/mnt a /proc/mounts?

/proc/cpuinfo e /proc/meminfo in Linux

Comprendere i file /proc/mounts, /etc/mtab e /proc/partitions

Perché la stampa su stdout è così lenta? Si può velocizzare?

Come posso fermare un processo symfony che è in ascolto su http://127.0.0.1:8000

Perché ci sono così tanti /dev/tty in Linux?