Perl 스크립트는 무한히 실행됩니다. 무슨 일이 일어나고 있는지 디버깅하는 방법은 무엇입니까?

Perl 스크립트는 무한히 실행됩니다. 무슨 일이 일어나고 있는지 디버깅하는 방법은 무엇입니까?

Linux 시스템에서 cron 작업을 통해 Perl 스크립트를 실행하고 있습니다. 그러나 때로는(전체 사례의 약 1%) 스크립트가 중단되어 무기한 실행되는 경우도 있습니다. 프로세스를 나열하면 PID임을 알 수 있습니다. 그러나 나는 그것을 즉시 죽이고 싶지 않고 오히려 무엇이 잘못되었는지 알고 싶습니다.

스크립트의 어느 줄이 실행되고 있는지 표시하는 방법이 있나요? PID 기반 스크립트의 단계별 디버깅과 유사합니다.

답변1

아래 단계를 따르십시오. - 셸의 프로세스 pid를 찾으려면 다음 명령을 사용할 수 있습니다.

  ps -ef | grep <your_script_name> 
  • 쉘 변수 $PID에 이 pid를 설정해 보겠습니다. 다음을 실행하여 이 $PID에 대한 모든 하위 프로세스를 찾습니다.

    ps --ppid $PID
    

하나 이상을 찾을 수 있습니다(예: 일련의 파이프된 명령에 멈춘 경우). 이 명령을 여러 번 반복하십시오. 변경되지 않으면 스크립트가 일부 명령에 멈춰 있음을 의미합니다. 이 경우 실행 중인 하위 프로세스에 추적 명령을 연결할 수 있습니다.

    sudo strace -p $PID

이는 무한 루프(파이프에서 읽는 것과 같은) 또는 결코 발생하지 않는 일부 이벤트를 기다리는 등 실행 중인 내용을 보여줍니다.

변경 사항이 표시되면 ps --ppid $PID이는 스크립트가 앞으로 나아가고 있지만 스크립트 내의 로컬 루프와 같은 어딘가에 멈춰 있음을 나타냅니다. 명령을 변경하면 스크립트에서 반복할 위치를 묻는 메시지가 표시될 수 있습니다.

마지막으로 Perl을 디버그하는 매우 쉬운 방법은 Perl 디버거를 사용하는 것입니다.

perl -d script.pl

더:1,2,,4,5

답변2

다음 스크립트 실행을 위해 패키지를 사용해 볼 수 있습니다개발::추적.

설명에 따르면: "이 모듈은 각 줄을 실행하기 전에 표준 오류에 대한 메시지를 인쇄합니다."

무엇이든 실행

perl -d:Trace program

또는 스크립트에서 사용

import Devel::Trace 'trace';

trace 'on';                 # Enable
trace 'off';                # Disable

관련 정보