데몬으로 실행중인 perl 스크립트가 있습니다. 데이터베이스에 10 초마다 도달하고 대기열에 작업이있는 경우 개별 작업을 실행하기 위해 별도의 셸을 생성합니다. 그러나 종종 스크립트는 데이터베이스에서 작업을 가져 오지 못합니다.프로세스의 strace 이해에 어려움이 있음
이상적으로
read(3, "\3def\3job\rqueueb\7JobTy"..., 55) = 55
read(3, ";\0\0\6", 4) = 4
아래는이 데몬/프로세스의 strace를이처럼 호출 dB로이 있어야합니다. 뭔가 기다리고 있니? 어떤 도움을 주셔서 감사합니다.
pipe([6, 7]) = 0
pipe([8, 9]) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0) = 31858
close(9) = 0
close(7) = 0
read(8, "", 4) = 0
close(8) = 0
fcntl64(6, F_GETFL) = 0 (flags O_RDONLY)
fstat64(6, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xfffffffff7783000
_llseek(6, 0, 0xffd4e540, SEEK_CUR) = -1 ESPIPE (Illegal seek)
fstat64(6, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
read(6, "", 4096) = 0
close(6) = 0
munmap(0xf7783000, 4096) = 0
rt_sigaction(SIGHUP, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
waitpid(31858, 0xffd4e670, 0) = -1 ECHILD (No child processes)
rt_sigaction(SIGHUP, {SIG_DFL, [], 0}, NULL, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], 0}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], 0}, NULL, 8) = 0
그리고 이것은 적어도 두 번 이상 반복됩니다.
strace가 소스 코드 없이는 가치가 있다고 생각하지 않습니다. 그리고 소스가 Perl이라면 strace가 도움이 될지 의심 스럽습니다. 디버거에서 Perl을 실행하고 작업을 사용할 수 없음을 감지 한 곳에서 중단 점을 설정하고 작업을 사용할 수있는 상황에서 트리거 할 때까지 기다려야합니다. 그런 다음 프로그램의 변수를보고 무슨 일이 일어나고 있는지 알아보십시오. –
아니면 유용하다고 생각되는 장소에서 인쇄문을 사용하여 Perl 스크립트를 작성하십시오. 또는 여기에 스크립트를 게시하십시오. 여전히 문제가있는 최소 버전으로 축소하십시오. 이 스크립트 (strace)는 스크립트에 대한 단서가없는 사람들에게 거의 사용되지 않습니다. – zdim
_llseek은 용의자처럼 보입니다. 무슨 일이 일어나고 있는지 이해하기 위해 스크립트를 볼 필요가 있습니다. – codeforester