Faire un strace
de tail -f
, il explique tout. La partie intéressante:
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)
Ce qu'il fait? Il configure un inotify
gestionnaire du fichier, puis attend que quelque chose se produise avec ce fichier. Si le noyau dit à tail
travers ce gestionnaire inotify, que le fichier a changé (normalement, a été ajouté), alors tail
1) cherche 2) lit les modifications 3) les écrit à l'écran.
/proc/3844/fd/1
sur votre système est un lien symbolique vers /dev/pts/14
, qui est un périphérique de caractères. Il n'y a rien de tel que certains comme une "carte mémoire", qui pourrait être accessible par cela. Ainsi, il n'y a rien dont les modifications pourraient être signées dans l'inotify, car il n'y a pas de zone de disque ou de mémoire accessible par cela.
Ce périphérique de caractères est un terminal virtuel, qui fonctionne pratiquement comme s'il s'agissait d'une prise réseau. Les programmes exécutés sur ce terminal virtuel se connectent à cet appareil (comme si vous vous connectiez telnet à un port tcp) et écrivent dans quoi ils veulent écrire. Il y a aussi des choses plus complexes, par exemple le verrouillage de l'écran, les séquences de contrôle de terminal et autres, celles-ci sont normalement gérées par des ioctl()
appels.
Je pense que vous voulez en quelque sorte regarder un terminal virtuel. Cela peut être fait sur linux, mais ce n'est pas si simple, il a besoin de certaines fonctionnalités de type proxy réseau et d'un peu d'utilisation délicate de ces ioctl()
appels. Mais il existe des outils qui peuvent le faire.
Actuellement, je ne me souviens pas quel paquet Debian a l'outil pour atteindre cet objectif, mais avec un peu de recherche sur Google, vous pourrez probablement le trouver facilement.
Extension: comme @Jajesh l'a mentionné ici (donnez-lui un +1 si vous me l'avez donné), l'outil est nommé watch
.
Extension # 2: @kelnos a mentionné, un simple cat /dev/pts/14
était également suffisant. J'ai essayé cela, et oui, cela a fonctionné, mais pas correctement. Je n'ai pas beaucoup expérimenté avec cela, mais il me semble que si une sortie entrant dans ce terminal virtuel est allée soit à la cat
commande, soit à son emplacement d'origine, et jamais aux deux. Mais ce n'est pas sûr.