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 oos.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.