tail
faz o que você deseja. Você precisa de dois recursos de tail
para fazer com que funcione no seu caso. A primeira é que tail
permite que você 'siga' (continue assistindo) o conteúdo do arquivo à medida que os arquivos crescem: (a partir do manpage)
-f, --follow[={name|descriptor}]
output appended data as the file grows; -f, --follow, and
--follow=descriptor are equivalent
O segundo recurso é que tail
aceita vários arquivos, mesmo quando usa -f
.
Eu testei com o seguinte programa em C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
int i;
setlinebuf(stdout);
setlinebuf(stderr);
for (i = 0; i < 10; i++) {
fprintf(stdout, "message on stdout ...\n");
sleep(1);
fprintf(stderr, "message on stderr ...\n");
sleep(1);
}
return 0;
}
Saída:
$ nohup ./prog > foo.out 2> foo.err & echo $!
9778
$ tail -f foo.out foo.err
==> foo.out <==
message on stdout ...
==> foo.err <==
message on stderr ...
==> foo.out <==
message on stdout ...
==> foo.err <==
message on stderr ...
==> foo.out <==
message on stdout ...
e assim por diante. Observe que as mensagens alternam bem uma a uma neste caso, mas isso pode nem sempre ser verdade. Você provavelmente deseja habilitar o buffer de linha (como eu fiz no programa de exemplo), a menos que você não se importe com a saída que chega em 'chunks'.