os.popen retorna uma string vazia quando chamado do cron

1

Estou tentando obter o uso da CPU do meu Raspberry Pi da seguinte forma:

def get_cpu_usage():
    return os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()

Quando executado normalmente, esse método retorna o uso correto, por exemplo, "7,2". Quando chamado pelo cron, ele retorna uma string vazia.

Meu crontab tem esta aparência:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * python /home/pi/sysinfo/dashboard.py

O que estou fazendo de errado?

    
por Peter W. 07.07.2013 / 19:37

2 respostas

4

Geralmente, quando algo não se comporta de acordo com o planejado ao ser executado no cron, mas é executado bem quando você o tenta em um terminal, os problemas são causados por uma das duas coisas possíveis:

  • o cron não tem o $ PATH (ou mais geralmente, ambiente) que você está acostumado ou espera. Isso pode ser resolvido em algum grau simplesmente especificando o caminho completo para tudo, configurando quaisquer variáveis de ambiente apropriadas dentro do cron ou em um script que você inicia através do cron e que pode executar qualquer configuração necessária antes de executar o comando real.
  • O
  • cron não executa comandos através de um TTY. Muitas coisas não se importam e voltam para um formato de saída sã, se elas forem executadas sem um TTY anexado, mas algumas coisas se importam. top se importa por padrão e deve ser informado para não se importar. Eu não sei se o os.popen() do Python aloca um TTY, mas duvido um pouco.

No seu caso particular, você pode contornar o problema adicionando o parâmetro -b a top . Conforme descrito na man page:

-b : Batch-mode operation

Starts top in 'Batch' mode, which could be useful for sending output from top to other programs or to a file. In this mode, top will not accept input and runs until the iterations limit you've set with the '-n' command-line option or until killed.

    
por 07.07.2013 / 20:40
1

Pode ser necessário adicionar uma variável PYTHONPATH ao seu arquivo crontab - é possível que sua instrução import os (que eu suponho esteja no topo do arquivo dashboard.py ) não esteja funcionando. Você terá que verificar o diretório exato em sua máquina, mas deve ser algo como /usr/local/lib/pythonX.X/ onde X.X é a versão do Python que você está usando.

    
por 07.07.2013 / 19:54