GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi ne puis-je pas `tail -f /proc/$pid/fd/1` ?

Faire un strace de tail -f , ça 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 met en place un inotify gestionnaire au fichier, puis attend que quelque chose se passe avec ce fichier. Si le noyau indique tail via ce gestionnaire inotify, que le fichier a changé (normalement, a été ajouté), puis tail 1) recherche 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 disque ou de zone mémoire accessible par celui-ci.

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 à ce périphérique (comme si vous vous connectiez par telnet à un port tcp) et écrivent ce 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 du terminal et autres, celles-ci sont normalement gérées par 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, cela nécessite des fonctionnalités de type proxy réseau et 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 cet objectif, mais avec un peu de recherche sur Google, vous pourriez probablement le trouver facilement.

Extension : comme @Jajesh l'a mentionné ici (donnez-lui un +1 si vous me l'avez donné), l'outil s'appelle watch .

Extension 2 : @kelnos a mentionné, un simple cat /dev/pts/14 suffisaient également. J'ai essayé, et oui, cela a fonctionné, mais pas correctement. Je n'ai pas beaucoup expérimenté cela, mais il me semble qu'une sortie entrant dans ce terminal virtuel a disparu soit au cat commande, ou à son emplacement d'origine, et jamais aux deux. Mais ce n'est pas sûr.


Fichiers en /dev/pts ne sont pas des fichiers normaux, ce sont des descripteurs de terminaux virtuels.A pts le comportement pour la lecture et l'écriture n'est pas symétrique (c'est-à-dire que ce qui y est écrit peut être lu plus tard, comme un fichier normal ou un fifo/pipe), mais médiatisé par le processus qui a créé le terminal virtuel :certains courants sont xterm ou ssh ou agetty ou screen. Le processus de contrôle répartira généralement les pressions sur les touches vers les processus qui lisent le pts fichier, et restituent à l'écran ce qu'ils écrivent sur le pts .

Ainsi, tail -f /dev/pts/14 imprimera les touches que vous appuyez sur le terminal à partir duquel vous avez démarré votre script, et si vous faites echo meh > /dev/pts/14 le meh message apparaîtra dans le terminal.


Linux
  1. Pourquoi l'impression sur stdout est-elle si lente ? Peut-il être accéléré ?

  2. Quand dois-je utiliser /dev/shm/ et quand dois-je utiliser /tmp/?

  3. Pourquoi ne puis-je pas faire défiler dans le terminal ?

  4. Pourquoi MemTotal dans /proc/meminfo change-t-il ?

  5. Pourquoi les répertoires /home, /usr, /var, etc. ont-ils tous le même numéro d'inode (2) ?

Bash =~ Regex et Https://regex101.com/?

Linux – Lier /proc/mnt à /proc/mounts ?

Fichiers /proc/cpuinfo et /proc/meminfo sous Linux

Comprendre les fichiers /proc/mounts, /etc/mtab et /proc/partitions

Pourquoi mettre des choses autres que /home sur une partition séparée ?

Pourquoi < ou > sont-ils nécessaires pour utiliser /dev/tcp