Como redirecionar o stdout para um arquivo e ler do mesmo arquivo simultaneamente com outra tarefa?

5

Eu quero executar uma tarefa (que leva muito tempo) remotamente no Ubuntu Linux Bash via nohup e redirecionar stdout para um arquivo, por exemplo:

nohup task > out.txt &

De vez em quando, gostaria de verificar o progresso da tarefa procurando no arquivo de saída:

cat out.txt

Eu ainda não descobri como fazer isso porque o conteúdo do arquivo é mostrado como vazio desde que o arquivo seja aberto para gravação pelo Bash.

Então minha pergunta é: Existe algum comando linux que permita um redirecionamento 'compartilhado' stdout ?

    
por Wildkeiler 16.07.2014 / 16:19

2 respostas

3

the file's content is shown as empty as long as the file is opened for writing by Bash.

Isso não é exatamente o que está acontecendo. O que está acontecendo é que a tarefa armazena em buffer sua saída - ela é acumulada na memória por um tempo, depois gravada no arquivo em partes . O buffer na memória tem um tamanho fixo de alguns kilobytes. Isso é feito para desempenho, já que cada gravação de arquivo tem uma sobrecarga relativamente alta. Então você não verá a saída do seu programa no começo, mas verá o que acontecerá peça por peça. Isso não tem nada a ver com o bash.

Se quiser ver a saída imediatamente, você pode iniciar sua programa com unbuffer (do expect pacote de software). Você troca o desempenho pelo imediatismo.

Um segundo problema é que cat mostrará a saída que já foi emitida e sairá assim que ela chegar ao final do arquivo. Se você quiser continuar lendo a saída quando ela for anexada, use o tail siga o modo.

nohup unbuffer task >out.txt &
tail -n +1 -f out.txt

Pressione Ctrl + C para sair de tail . Em vez de tail , você pode usar less e seu modo de seguimento (pressione F ; pressione Ctrl + C para parar a leitura).

    
por 17.07.2014 / 14:24
2

Dê uma olhada no comando tee , aqui são alguns exemplos com ele.

The following command (with the help of tee command) writes the output both to the screen (stdout) and to the file.

$ ls | tee file
    
por 16.07.2014 / 16:27