Script Perl executando infinitamente - como depurar o que aconteceu?

6

Estou executando um script Perl em uma máquina Linux por meio de uma tarefa cron. No entanto, de tempos em tempos (cerca de 1% de todos os casos), o script fica preso e é executado infinitamente. Se eu listar processos, posso ver seu PID. No entanto, não quero matá-lo imediatamente; Eu preferiria saber o que deu errado.

Existe uma maneira de mostrar quais linhas estão sendo executadas a partir do script? Algo como depuração passo a passo do script com base no PID.

    
por Martin Perry 22.09.2018 / 11:07

2 respostas

7

Tente seguir estes passos: - encontre o processo pid do shell, você pode usar um comando como:

  ps -ef | grep <your_script_name> 
  • Vamos definir este pid na variável do shell $ PID. Encontre todos os processos filhos deste $ PID executando o comando:

    ps --ppid $PID
    

Você pode encontrar um ou mais (se, por exemplo, ele estiver preso em uma série de comandos em pipeline). Repita este comando algumas vezes. Se isso não mudar, significa que o script está preso em determinado comando. Nesse caso, você pode anexar o comando trace ao processo filho em execução:

    sudo strace -p $PID

Isso mostrará o que está sendo executado, seja um loop indefinido (como a leitura de um pipe) ou aguardando algum evento que nunca acontece.

Caso você encontre ps --ppid $PID alterações, isso indica que seu script está avançando, mas está preso em algum lugar, por exemplo, loop local no script. A partir da mudança de comandos, pode dar-lhe uma dica onde no script está em loop.

Finalmente, um método muito simples para depurar um perl é usar o depurador perl:

perl -d script.pl

Mais: 1 , 2 , 3 , 4 , 5

    
por 22.09.2018 / 11:14
2

Para as próximas execuções do seu script, você pode experimentar o pacote Devel :: Trace .

A partir da descrição: "Este módulo irá imprimir uma mensagem para o erro padrão antes de cada linha ser executada."

Executar com

perl -d:Trace program

ou use em seu script com

import Devel::Trace 'trace';

trace 'on';                 # Enable
trace 'off';                # Disable
    
por 22.09.2018 / 11:17

Tags