Fare un strace
di tail -f
, si 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
gestore per il file e quindi attende che accada qualcosa con questo file. Se il kernel dice tail
attraverso questo gestore inotify, che il file è cambiato (normalmente, è stato aggiunto), allora 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 personaggio. Non esiste qualcosa come una "mappa di memoria", alla quale si può accedere. Pertanto, non esiste nulla le cui modifiche possano essere firmate per inotify, poiché non vi è alcuna area su disco o memoria a cui si possa accedere.
Questo dispositivo personaggio è un terminale virtuale, che funziona praticamente come se fosse un socket di rete. I programmi in esecuzione su questo terminale virtuale si stanno connettendo a questo dispositivo (proprio come se si fosse telnetizzato in una porta tcp) e scrivessero ciò che vogliono scrivere. Ci sono anche cose più complesse, ad esempio il blocco dello schermo, le sequenze di controllo dei terminali e simili, che normalmente vengono gestite dalle ioctl()
chiamate.
Penso che tu voglia in qualche modo guardare un terminale virtuale. Può essere fatto su Linux, ma non è così semplice, ha bisogno di alcune funzionalità di tipo proxy di rete e un po 'di uso complicato di queste ioctl()
chiamate. Ma ci sono strumenti che possono farlo.
Al momento non ricordo, quale pacchetto debian ha lo strumento per questo obiettivo, ma con un po 'di googling potresti trovarlo probabilmente facilmente.
Estensione: come menzionato qui @Jajesh (dagli un +1 se mi hai dato), lo strumento è chiamato watch
.
Estensione n. 2: @kelnos menzionato, cat /dev/pts/14
bastava anche un semplice . Ci ho provato, e sì, ha funzionato, ma non correttamente. Non l'ho sperimentato molto, ma mi sembra che un'uscita in quel terminale virtuale sia andata al cat
comando, o alla sua posizione originale, e mai ad entrambi. Ma non è sicuro.