Como evitar o encerramento do script Python de longa execução

2

Eu tenho um cron job executando um script Python em um servidor Ubuntu remoto baseado em VM. O script leva algumas horas para ser executado, e estou percebendo que o kernel parece estar terminando o script antes de ser concluído, como mostra o log:

myscript.py: line 11:  4890 Terminated

Eu monitorei o uso de CPU e memória do meu script via top enquanto ele está em execução, e isso nunca fica excessivo.

Como descubro por que meu script está sendo encerrado e como evitar o encerramento prematuro?

    
por Cerin 10.07.2013 / 22:13

2 respostas

2

Você pode exceder alguns limites definidos por padrão ou em /etc/security/limits.conf . Você pode querer executar o comando ulimit -a como um cronjob. Isso deve mostrar os limites que você está recebendo no cron.

É possível que o trabalho esteja sendo morto por um programa de monitoramento de terminal inativo ou matador de processo fugitivo. Há um grande número desses programas, a maioria dos quais pode ser programada para ignorar processos conhecidos de longa duração.

Editar: os valores padrão têm limites que podem ser excedidos. Estes são os limites que obtenho por padrão:

:~$ ulimit -a | grep -v unlim
core file size          (blocks, -c) 0
scheduling priority             (-e) 0
pending signals                 (-i) 61167
max locked memory       (kbytes, -l) 64 
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
max user processes              (-u) 61167

Destes open files e stack size são os dois que eu esperaria que fossem mais provavelmente excedidos. Arquivos abertos podem ser monitorados contando as entradas em / proc / XXX / fd, onde XXX é o id do processo do seu script. Não tenho conhecimento de nenhuma maneira fácil de monitorar o tamanho da pilha. Executar o programa a partir de um script que aumenta o limite de tamanho da pilha pode ajudar a determinar se esse é o problema.

Eu também verificaria todos os logs escritos no momento em que o programa é finalizado para ver se há algo registrado. Se você pode modificar o programa para ser mais detalhado ao sair.

    
por 11.07.2013 / 06:17
1

Se é o kernel, você deve ver isso no dmesg. Caso contrário, você terá que procurar outra coisa que esteja encerrando seu script (talvez um killall python muito amplo em outro lugar?).

    
por 11.07.2013 / 10:42