2016-12-15 5 views
-1

데몬으로 실행중인 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 

그리고 이것은 적어도 두 번 이상 반복됩니다.

+3

strace가 소스 코드 없이는 가치가 있다고 생각하지 않습니다. 그리고 소스가 Perl이라면 strace가 도움이 될지 의심 스럽습니다. 디버거에서 Perl을 실행하고 작업을 사용할 수 없음을 감지 한 곳에서 중단 점을 설정하고 작업을 사용할 수있는 상황에서 트리거 할 때까지 기다려야합니다. 그런 다음 프로그램의 변수를보고 무슨 일이 일어나고 있는지 알아보십시오. –

+0

아니면 유용하다고 생각되는 장소에서 인쇄문을 사용하여 Perl 스크립트를 작성하십시오. 또는 여기에 스크립트를 게시하십시오. 여전히 문제가있는 최소 버전으로 축소하십시오. 이 스크립트 (strace)는 스크립트에 대한 단서가없는 사람들에게 거의 사용되지 않습니다. – zdim

+0

_llseek은 용의자처럼 보입니다. 무슨 일이 일어나고 있는지 이해하기 위해 스크립트를 볼 필요가 있습니다. – codeforester

답변

0

자식 프로세스 (clone)를 생성하고이 프로세스에서 데이터를 얻으려고합니다 (read 6). 자식이 파이프를 닫았으므로 EOF (0)를 반환합니다. 이것은 아이가 나간 표식으로 간주되므로 아이를 수확하려고합니다 (waitpid). 실패 (-1), 즉 $SIG{CHLD}IGNORE으로 설정되어야합니다. 상태가 유용했을 수도 있습니다.

8/9 파이프의 존재는 어린이가 exec으로 전화 할 것임을 나타냅니다. 파이프는 파일 핸들을 조작하는 오류 또는 exec을 호출하는 오류를 부모에게 알리는 데 사용됩니다. 이 자식은 9을 exec-on으로 설정했을 것이므로이 파이프에서 데이터가없는 EOF를 수신하면 exec이 성공했음을 나타냅니다.