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
답변2
다음 스크립트 실행을 위해 패키지를 사용해 볼 수 있습니다개발::추적.
설명에 따르면: "이 모듈은 각 줄을 실행하기 전에 표준 오류에 대한 메시지를 인쇄합니다."
무엇이든 실행
perl -d:Trace program
또는 스크립트에서 사용
import Devel::Trace 'trace';
trace 'on'; # Enable
trace 'off'; # Disable