Redirecionar stdout para arquivo com nohup não funciona

1

Estou tentando executar um programa em C em segundo plano. Eu também quero salvar as saídas stdout do programa.

Mas se eu tentar o seguinte, o nohup apenas redirecionará as saídas stderr para o arquivo de log.txt:

nohup ./GetTempValues 11 4 > logfile.txt 2>&1 &

Onde 11 e 4 são os parâmetros que preciso passar para o meu programa e o último & é para executar o programa em segundo plano (GetTempValues é o meu programa).

    
por Michael Gierer 10.04.2016 / 19:18

2 respostas

2

Como Guido aponta acima, o nohup já redireciona o erro padrão para você, a menos que você o redirecione para um arquivo. Se você estiver usando Linux, pode ser instrutivo executar um comando simples em nohup e examinar as chamadas para dup2(2) imediatamente antes de execve(2) .

Eu duvido que você esteja vendo o que pensa que está vendo. Vamos pensar sobre o que acontece quando você diz

nohup foo 2>&1
  1. O shell redireciona stderr para stdout.
  2. Em seguida, ele invoca nohup , que herda essa situação (stderr e stdout usando o mesmo descritor de arquivo).
  3. nohup abre nohup.out (descritor de arquivo 3), dups dele para o descritor de arquivo 1 e fecha 3.
  4. nohup avisos stderr não é arquivo, e dups arquivo descritor 1 a 2, também. Assim, os descritores de arquivo 1 e 2 referem-se a nohup.out .
  5. nohup chama exec com quaisquer argumentos fornecidos na linha de comando (neste caso, foo ). O novo processo herda os descritores de arquivo que nohup configuram para ele.

Na linha de comando você não pode criar um caso no qual, como você diz, nohup apenas redireciona stderr-outputs . nohup sempre grava stdout e stderr em um arquivo. stdout vai para um que você especificar via redirecionamento, ou para nohup.out ; stderr segue stdout a menos que você redirecione explicitamente para outro arquivo.

O aspecto peculiar de usar 2>&1 com nohup é que a versão do GNU produz uma mensagem sem sentido no stderr, nohup: ignorando entrada e adicionando saída a 'nohup.out' . (Que outro utilitário grava uma mensagem para erro padrão que equivale a dizer, agindo por documentação em instruções ?) Normalmente esse ruído é gravado no terminal; sob redirecionamento, ele acaba sendo a primeira linha do arquivo de saída.

    
por 11.04.2016 / 02:33
3

Tem certeza de que GetTempValues produz alguma saída padrão para começar? Porque sua sintaxe "funciona para mim":

$ nohup perl test.pl >logfile.txt 2>&1 &
[1] 20964
$ cat logfile.txt 
this goes to stderr
this goes to stdout
[1]+  Done                    nohup perl test.pl > logfile.txt 2>&1

em que test.pl é

print STDOUT "this goes to stdout\n";
print STDERR "this goes to stderr\n";

PS: Redirecionar STDERR para STDOUT com 2>&1 não é necessário com nohup no seu exemplo, porque "se o erro padrão for um terminal, ele será direcionado para o mesmo local que a saída padrão." ( nohup man page).

    
por 10.04.2016 / 20:09