Fazer uma strace
de tail -f
, ele 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 faz? Ele configura um inotify
manipulador para o arquivo e aguarda até que algo aconteça com esse arquivo. Se o kernel diz tail
através deste manipulador 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 há um link simbólico para /dev/pts/14
, que é um dispositivo de caractere. Não existe algo como um "mapa de memória", que possa ser acessado por isso. Portanto, não há nada cujas alterações possam ser assinadas no inotify, porque não há área de disco ou memória que possa ser acessada por isso.
Esse dispositivo de caractere é um terminal virtual, que praticamente funciona como se fosse um soquete de rede. Os programas executados neste terminal virtual estão se conectando a este dispositivo (como se você tivesse telnetado em uma porta TCP) e gravando o que eles queriam escrever. Também existem coisas mais complexas, como bloquear a tela, seqüências de controle de terminal e outras, normalmente são tratadas por ioctl()
chamadas.
Eu acho que você quer assistir de alguma forma a um terminal virtual. Isso pode ser feito no Linux, mas não é tão simples, ele precisa de algumas funcionalidades de proxy de rede e um pouco de uso complicado dessas ioctl()
chamadas. 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 pesquisa você pode achar isso facilmente.
Extensão: como @Jajesh mencionado aqui (dê a ele um +1, se você me der), a ferramenta será nomeada 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 experimentou muito com isso, mas parece-me como se uma saída entrar naquela terminal virtual ido quer ao cat
comando ou à sua localização original, e nunca a ambos. Mas não tem certeza.