Aqui está um script python simples que pode ajudar. Ele apenas lê stdin e grava em stdout, mas mantém os últimos N bytes na memória. Se você interrompê-lo com o controle-C (SIGINT), ele despeja a memória no arquivo /tmp/sample001
e continua.
#!/usr/bin/python3
# circular buffer in memory without recopy using bytearray
# https://unix.stackexchange.com/a/401875/119298
import sys, os
def copy():
def dump(fd,v):
fd.write(v)
space = 10000000
buffer = bytearray(space) # all zero bytes
view = memoryview(buffer)
head = 0; wrapped = False
sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
fileno = 1
while True:
try:
nbytes = sys.stdin.readinto(view[head:])
if nbytes==0:
break # eof
sys.stdout.write(view[head:head+nbytes].tobytes())
head += nbytes
if head>=space:
head = 0; wrapped = True
except KeyboardInterrupt:
filename = "/tmp/sample%03d" % fileno
fileno += 1
with open(filename,"wb") as fd:
if wrapped:
dump(fd, view[head:])
if head:
dump(fd, view[0:head])
copy()
Se você não tiver python3, precisará de algumas alterações para o python 2.7. Talvez seja necessário se preocupar em como preservar um formato de enquadramento AAC legal, mas, talvez, se você tentar primeiro, pode descobrir que o que está usando gerencia a auto-sincronização de dados arbitrários de deslocamento.