Faça um strace
de tail -f
, isso explica tudo. A 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)
O que isso faz? Ele configura um manipulador inotify
para o arquivo e aguarda até que algo aconteça com esse arquivo. Se o kernel diz tail
através deste manipulador de inotify, que o arquivo foi alterado (normalmente, foi anexado), então tail
1) procura 2) lê as alterações 3) as grava na tela.
/proc/3844/fd/1
no seu sistema é um link simbólico para /dev/pts/14
, que é um dispositivo de caractere. Não existe algo como um "mapa de memória", que poderia ser acessado por isso. Portanto, não há nada cujas alterações possam ser assinadas para o inotify, porque não há disco ou área de memória que possa ser acessada por ele.
Este dispositivo de caractere é um terminal virtual, que praticamente funciona como se fosse um soquete de rede. Programas em execução neste terminal virtual estão se conectando a este dispositivo (como se você tivesse telnetado em uma porta tcp), e escrevendo o que eles queriam gravar. Também existem coisas mais complexas, por exemplo, travar a tela, seqüências de controle de terminal e tais, estas são normalmente tratadas por ioctl()
chamadas.
Eu acho que você quer de alguma forma assistir a um terminal virtual. Isso pode ser feito no linux, mas não é tão simples, ele precisa de alguma funcionalidade de proxy de rede e um pouco de uso complicado dessas chamadas de ioctl()
. Mas existem ferramentas que podem fazer isso.
Atualmente não me lembro, qual pacote debian tem a ferramenta para esse objetivo, mas com um pouco de googling você pode achar isso provavelmente com facilidade.
Extensão: como @Jajesh mencionado aqui (dê +1 se você me deu), a ferramenta é chamada watch
.
Extensão # 2: @kelnos mencionado, um simples cat /dev/pts/14
também foi suficiente. Eu tentei isso e sim, funcionou, mas não corretamente. Eu não experimentei muito com isso, mas parece-me como se uma saída para esse terminal virtual fosse para o comando cat
, ou para o seu local original, e nunca para ambos . Mas não tem certeza.