Escrevendo saída para arquivo, semelhante ao comando “script”?

0

Existe algo semelhante a "script", mas não requer que o terminal seja aberto?

Eu quero salvar os resultados do meu programa em um arquivo, mas tenho alguns problemas. Eu preciso trabalhar remotamente, mas tenho uma conexão de internet ruim. Assim, geralmente corro:

./MyProgram.exe > output.txt &

E os resultados do meu programa são salvos no arquivo output.txt.

No entanto, quando executo meu programa em determinados objetos, recebo um erro "SIGSEGV: Falha de segmentação". O programa termina e está tudo bem, eu sei que vai fazer isso. Mas acabo perdendo todos os meus dados de objetos anteriores antes que o programa encontrasse esse objeto problemático que causa a erradicação.

Como posso gravar tudo, os resultados dos objetos não problemáticos, bem como este erro, em um arquivo / s?

Eu tentei:

./MyProgram.exe > output.txt 2>&1 &

./MyProgram.exe > output.txt 2> error.txt &

./MyProgram.exe > & error-n-output.txt &

Mas todos os itens acima apenas registram o erro de segmentação, mas não os resultados dos objetos anteriores, embora eu saiba que o programa funciona para os objetos anteriores.

Eu também tentei o comando script digitando da seguinte forma:

Myname@Computer ~/Folder $ script screen.log
Script started, file is screen.log
Myname@Computer ~/Folder $./MyProgram.exe
~~~THE RESULTS AND THE SEGMENTATION ERROR ARE PRINTED ON SCREEN SO I CAN RECORD THE RESULTS FOR SOME OBJECTS AND IGNORE THE ERROR~~
Myname@Computer ~/Folder $ exit
exit
Script done, file is screen.log

E tudo o que estava na tela é gravado no arquivo screen.log. Isso pode ser bom, no entanto, devido à minha conexão de internet ruim eu não posso deixar a tela em execução por um longo tempo. Eu preciso sair do terminal, mas é claro que o meu programa fecha e nada é escrito no arquivo "screen.log".

Existe algo parecido com o script , mas não requer que o terminal seja aberto?

    
por Guest 14.05.2016 / 00:22

4 respostas

1

nohup é provavelmente o que você deseja. A finalidade de nohup é "executar um comando, ignorando os sinais de desligamento". Em outras palavras, se a conexão ssh , telnet , serial, etc for desconectada por qualquer razão (diferente do host travando, desligando ou reiniciando, é claro), seu programa continuará funcionando.

Você provavelmente também deseja executar o comando nohup -ed em segundo plano (usando & ), pois todas as saídas serão redirecionadas para um arquivo.

Por exemplo:

nohup MyProgram.exe &

Por padrão, ele salvará a saída em ./nohup.out ou ~/nohup.out , mas você poderá redirecionar para um arquivo diferente, se desejar. Na página do manual:

If standard input is a terminal, redirect it from an unreadable file. If standard output is a terminal, append output to nohup.out if possible, $HOME/nohup.out otherwise. If standard error is a terminal, redirect it to standard output. To save output to FILE, use nohup COMMAND > FILE.

nohup é melhor usado para programas não interativos que não esperam informações dos usuários.

Se você precisar executar um programa que interaja diretamente com os usuários (por exemplo, um aplicativo ncurses ), use um multiplexador de terminal como o GNU tela ou tmux ou byobu ou similar em vez de nohup .

Os multiplexadores de terminal não apenas tornam seu programa imune a sinais de desligamento, mas também permitem a reconexão à mesma sessão de shell (e ao seu programa em execução) quando você efetua o login novamente após uma desconexão. Eles também permitem várias sessões de shell sobre a única conexão (por exemplo, ssh para sua máquina remota, executar screen e você pode criar, destruir e alternar entre tantas "janelas" de shell quanto desejar).

BTW, todos esses programas fornecem o shell padrão para que você possa executar script dentro deles, se desejar.

Eu tenho um link para as páginas iniciais desses programas, mas você provavelmente não precisa compilá-los para instalá-los - eles estão disponíveis como pacotes pré-compilados para a maioria das distribuições Linux, FreeBSD, Mac OS X, solaris e muito mais.

    
por 14.05.2016 / 06:30
0

Quando você deseja anexar à saída padrão, você pode usar >> em vez de apenas > :

./MyProgram.exe >> output.txt 2> error.txt &

Isso impedirá que sua saída seja sobregravada todas as vezes.

Isso obviamente não impedirá que o processo seja encerrado quando a sessão for encerrada. Se nohup estiver disponível, você deverá usá-lo para iniciar seu programa e permitirá que ele continue sendo executado mesmo que a sessão seja encerrada.

    
por 14.05.2016 / 01:02
0

Experimente o comando

stdbuf -oL ./MyProgram.exe > output.txt

A saída padrão dos programas é, por padrão, line buffered se a saída for um terminal, mas armazenada em buffer em blocos de 4kB se a saída for um arquivo regular (o que é o caso agora, já que você redireciona para output.txt) .

Isso significa que as funções padrão do stdio (como printf ()) coletam os dados até 4kB antes de realmente escrevê-los. Se o seu utilitário falha, então - muito ruim - este último pedaço que ainda não foi escrito está perdido.

stdbuf -oL define a saída padrão como buffer de linha, mesmo que a saída vá para um arquivo normal.

(Embora, sem dúvida, a solução mais limpa seria consertar seu aplicativo para não travar.)

Você pode ainda combinar isso com nohup ou screen , como mostrado em outras respostas.

    
por 14.05.2016 / 08:38
0

Apenas tente algo como:

program.exe &> /temp/output.log ;
# OR #
program.exe &> /temp/output.log &

Em algumas circunstâncias, você pode querer ficar de olho nele conforme muda, com algo como:

watch cat /temp/output.log
# OR #
watch --diff cat /temp/output.log

Ou de forma semelhante:

watch tail /temp/output.log
# OR #
watch --diff tail /temp/output.log

É meio difícil determinar exatamente o que você deseja, mas você pode achar úteis os seguintes utilitários:

script
# OR #
asciinema

Ao falhar em tudo isso, você provavelmente deve procurar usar um depurador, descompilador, desmontador, etc.

Deixe-me saber como você vai e ajustarei este post de acordo.

    
por 14.05.2016 / 08:46