printf, redirecionamento, crontab

1

Estou tendo problemas para redirecionar as instruções do C printf para um arquivo com um programa em execução como root.

Eu tenho um programa com várias instruções printf informativas e outras bibliotecas que imprimem erros via stderr. Eu gostaria de registrá-los em um arquivo. Se eu iniciar o programa a partir da linha de comando, posso ver as mensagens stderr e stdout.

sudo ./myprogram

Se eu tentar redirecionar assim,

sudo ./myprogram >> log_file 2>&1

O log_file contém apenas stderr e stdout desaparece.

Suspeito que o problema esteja relacionado ao fato de o usuário root não estar conectado ao stdout, mas não encontrei uma solução.

Meu objetivo final é executar este programa na inicialização do sistema como root, enquanto registra stderr e stdout em um log_file.
Eu tenho tentado isso usando crontab,

 sudo crontab -e

e adicionando a linha,

@reboot bin/myprogram >> log_file 2>&1

Isso gera mensagens stderr, mas stdout desaparece, igual à linha de comando.

Qualquer ajuda é apreciada, obrigado!

Edições e & amp; atualizações: Testando esta manhã, o redirecionamento se comporta da mesma forma sem o sudo. Uma típica declaração printf se parece com:

printf("info: passed safety check\n");

Estou usando uma configuração padrão para o ubuntu 14.04 em um processador ARM, então acredito que estou usando o bash. Eu confirmei com

echo $SHELL

produz

/bin/bash
    
por user2977486 29.07.2014 / 23:37

2 respostas

1
  

O comportamento de printf() parece depender da localização de    stdout .

     
  1. Se stdout for enviado para o console, printf() será armazenado em buffer de linha e será liberado depois que uma nova linha for impressa.
  2.   
  3. Se stdout for redirecionado para um arquivo, o buffer não será liberado, a menos que fflush() seja chamado.
  4.   
  5. Além disso, se printf() for usado antes de stdout ser redirecionado para o arquivo, as gravações subseqüentes (no arquivo) serão armazenadas em buffer de linha e serão   liberado após a nova linha.
  6.   

Fonte: Por que a stdout precisa flushing explícito quando redirecionado para o arquivo?

Eu não sou bem versado em programação C, mas aparentemente você precisa adicionar fflush(stdout); após cada instrução printf . Experimente da linha de comando. Se funcionar, deve funcionar com o cron.

Mais perguntas sobre este tópico:

por Alaa Ali 30.07.2014 / 17:06
0

O TLDP HowTo tem essa ótima sintaxe para redirecionamento de stdout e stderr :

  @reboot /path/to/program &> /path/to/log

O HowTo diz que às vezes é adequado para entradas do cron.

    
por muru 30.07.2014 / 14:04