2016-12-15 7 views
-1

私はデーモンとして実行しているperlスクリプトを持っています。データベースに10秒ごとにヒットし、キュー内にジョブがあれば、個別のジョブを実行するために別のシェルが生成されます。しかし、たいていの場合、スクリプトはデータベースからジョブをフェッチできません。理想的にはそこプロセスのstraceの理解に問題があります

は以下

read(3, "\3def\3job\rqueueb\7JobTy"..., 55) = 55 
read(3, ";\0\0\6", 4)     = 4 

のようなDBへの呼び出しでなければなりません。このデーモン/プロセスのstraceのです。何か待っている?私はどんな助けにも感謝します。

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 

これは直ちに(少なくとも)2回以上繰り返されます。

+3

私は、straceがソースコードなしでは価値がないとは思いません。そして、ソースがPerlなら、straceが役立つだろうかと疑う。デバッガでPerlを実行し、使用可能なジョブがないことを検出したブレークポイントを設定し、ジョブが利用可能であることがわかっている状況でトリガするまで待機する必要があります。次に、何が起こっているのか把握するために、プログラムの変数を見てください。 –

+0

あるいは、役に立つと思われる場所でprintステートメントを使って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が成功したことを示します。

関連する問題