Cron não escreve no log instantaneamente no Ubuntu

1

Eu executo um script Python através de cron . O script contém várias instruções impressas desde o início (a primeira linha é uma impressão). No entanto, mesmo se o script estiver em execução, o arquivo de log será criado, mas permanecerá em branco.

Aqui está o meu crontab:

00 14 * * * python DE.py >> DElog.log 2>&1

Alguém tem idéia do motivo?

    
por Mehdi 24.05.2018 / 17:03

2 respostas

0

Paciência é uma virtude.

Para iniciantes, o arquivo de log é criado primeiro, antes mesmo de o script começar a ser executado e gerar a saída.

Em segundo lugar no Linux, quando a saída padrão é redirecionada para algo diferente de um TTY (uma janela de terminal), a saída será totalmente armazenada em buffer por padrão, em vez da linha em buffer.

Como você também redireciona o erro padrão para o stdout (com 2>&1 ), nenhuma saída será gravada no disco até:
- seu script é concluído ou
- a saída excede o tamanho do buffer padrão (de 4k?).

Você pode ajustar o armazenamento em buffer com stdbuff e tornar os modos de erro e saída sem buffer:

stdbuf -o0 -e0 python DE.py >> DElog.log 2>&1
    
por 24.05.2018 / 17:47
0

O arquivo de log existe e está em branco porque é aberto pelo shell, mesmo antes de o script ser executado.

Veja:

    $ rm log
rm: log: No such file or directory
    $ thatdoesnotexist > log
-bash: thatdoesnotexist: command not found
    $ ls log
log

Assim, o seu script provavelmente não é executado.

Primeiro, para crontab, sempre especifique o caminho completo. Então, ao invés de

python DE.py

coloque algo como (ajuste o caminho, é claro)

python /usr/local/bin/DE.py

O mesmo para o arquivo de log: especifique seu caminho completo.

Agora você não especificou qual crontab é esse usuário? Como você entrou nessas linhas? Porque você precisará certificar-se de que o usuário sob o qual este comando será executado tenha direitos suficientes. Ele precisará de acesso de leitura para ler o arquivo python e executá-lo e, em seguida, precisará de acesso de gravação no caminho do arquivo de log para poder gravar nele.

Este é o primeiro passo que você precisa corrigir.

Além disso, passe a dica: com o shell bash,

 >> DElog.log 2>&1

pode ser simplificado para

&>> DElog.log
    
por 24.05.2018 / 17:23

Tags