私はデーモンとして実行している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回以上繰り返されます。
私は、straceがソースコードなしでは価値がないとは思いません。そして、ソースがPerlなら、straceが役立つだろうかと疑う。デバッガでPerlを実行し、使用可能なジョブがないことを検出したブレークポイントを設定し、ジョブが利用可能であることがわかっている状況でトリガするまで待機する必要があります。次に、何が起こっているのか把握するために、プログラムの変数を見てください。 –
あるいは、役に立つと思われる場所でprintステートメントを使ってPerlスクリプトを実行してください。または、ここにスクリプトを投稿しても、その問題がまだ残っている最小限のバージョンに減らすことができます。このスクリプト(strace)はあなたのスクリプトについての手がかりがない人にはほとんど役に立たない。 – zdim
_llseekは容疑者のようです。何が起こっているのかを理解するためにスクリプトを見る必要があります。 – codeforester