Determine se o produtor está superando o consumidor no pipeline

4

Se eu tiver:

node foo.js | node bar.js

Existe uma maneira de determinar se existe uma fila entre eles que está aumentando? em outras palavras, se o produtor está superando o consumidor. stdio?

    
por Alexander Mills 27.04.2018 / 01:38

1 resposta

2

Você pode usar ioctl(,FIONREAD,) em pipes no Linux para obter o número atual de bytes disponíveis para leitura. Isso pode ser encontrado em man 7 pipe ( FIONREAD também está em man tty_ioctl ). Você pode integrar isso em seu aplicativo ou executar algo parecido com esse bit de perl em paralelo com ele, usando o pipe como stdin:

#!/usr/bin/perl
# https://unix.stackexchange.com/a/440361/119298
use strict;
require 'sys/ioctl.ph';
my $v = pack("l",0);
$| = 1;
# while(1)
{
  die "ioctl: $!" if ioctl(STDIN, &FIONREAD, $v)!=0;
  my @r = unpack("l",$v);
  printf "%d ",$r[0];
#  sleep 1;
}

Assim, o uso seria

node foo.js | (myperl & node bar.js)

Experimente com algo como

while sleep 1;do date;done |
while sleep 1.1;do myperl 2>/dev/null; dd status=none count=1 bs=20;done

Recebo avisos de perl sobre _FORTIFY_SOURCE , daí o redirecionamento stderr. O dd lê menos que o comprimento de date para que você possa ver o resultado aumentando gradualmente.

Para completar, você pode obter a capacidade de um canal com fcntl(,F_GETPIPE_SZ) e defini-lo com fcntl(,F_SETPIPE_SZ,newvalue) até /proc/sys/fs/pipe-max-size (a menos que tenha raiz ou tenha CAP_SYS_RESOURCE ). Veja man fcntl .

    
por 27.04.2018 / 10:24