2 votes

Pourquoi du -sk ne rapporte pas la taille d'un fifo ?

Il existe un concept dans bash appelé substitution de processus. Vous pouvez exécuter une commande et utiliser la sortie comme un fichier.

par exemple

$ cat -n <(seq 3|tac)
     1  3
     2  2
     3  1

Je suis curieux de savoir pourquoi l'opération suivante échoue ;

$ du -sk <(xzcat /var/log/mpd/scribble.log.xz )
0   /dev/fd/63

De même, nous avons ceci

$ file <(seq 1 2)
/dev/fd/63: broken symbolic link to pipe:[32560687]

Le fichier n'est pas vide.

$ xzcat /var/log/mpd/scribble.log.xz  | wc -c 
16877047

>/dev/null  pv  <(xzcat /var/log/mpd/scribble.log.xz ) 
16.1MiB 0:00:00 [ 232MiB/s] [  <=>                   ]

Comme question bonus, connaissez-vous une technique en bash pour masquer les fifos comme des fichiers réguliers pour une courte durée ?

2voto

Oleg Bolden Points 1637

Les fichiers ordinaires sont constitués de trois éléments principaux :

  1. Nom (lien dur)
  2. Inode (information système)
  3. Corps (données)

Les tuyaux (qu'ils soient nommés ou anonymes, persistants ou temporaires) n'ont pas de corps. Par conséquent, ils ont toujours une taille nulle, contrairement aux fichiers ordinaires. Ils ont seulement un tampon en mémoire. C'est pourquoi le pipe anonyme nommé /dev/fd/63 a une longueur nulle. Vous pourriez utiliser n'importe quelle autre commande avec l'opérateur <(...) avec le même résultat, par exemple

du -sk <(cat somefile)

Vous pouvez créer un tube nommé avec la commande mkfifo pour voir que sa taille est toujours égale à zéro même si vous remplissez entièrement son tampon. En fait, la taille des fichiers des tubes nommés (et de tout autre) n'a pas de sens réel et est fixée à zéro pour l'uniformité de la liste parmi les autres fichiers.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X