2017-01-27 6 views
0

特定のことを行うためにOracle DBに接続するPHPスクリプトを呼び出すアプリケーションがあります。 :)これは時々うまくいくわけではありません。読み取り後にSIGHUPによって処理されたプロセスERESTARTSYS

ここからは、最初からstrace経由でPHPパーツを実行しています。

これは、すべてがうまく動作するとき、それがどのように見えるかです(すべてがうまくいく、DB接続が構築され、クエリが実行され、DB等、再び切断されている):

10:30:17.935486 connect(8, {sa_family=AF_INET, sin_port=htons(1521), sin_addr=inet_addr("10.1.1.55")}, 16) = -1 EINPROGRESS (Operation now in progress) 
10:30:17.935546 times(NULL)    = 2908590046 
10:30:17.935569 brk(0xda4000)   = 0xda4000 
10:30:17.935594 poll([{fd=8, events=POLLOUT}], 1, 60000) = 1 ([{fd=8, revents=POLLOUT}]) 
10:30:17.940338 getsockopt(8, SOL_SOCKET, SO_ERROR, [519270883345301504], [4]) = 0 
10:30:17.940368 fcntl(8, F_GETFL)  = 0x802 (flags O_RDWR|O_NONBLOCK) 
10:30:17.940388 fcntl(8, F_SETFL, O_RDWR) = 0 
10:30:17.940408 getsockname(8, {sa_family=AF_INET, sin_port=htons(62498), sin_addr=inet_addr("192.168.22.30")}, [16]) = 0 
10:30:17.940437 getsockopt(8, SOL_SOCKET, SO_SNDBUF, [-4193870156763480064], [4]) = 0 
10:30:17.940458 getsockopt(8, SOL_SOCKET, SO_RCVBUF, [-4193870156763409068], [4]) = 0 
10:30:17.940483 setsockopt(8, SOL_TCP, TCP_NODELAY, [1], 4) = 0 
10:30:17.940506 fcntl(8, F_SETFD, FD_CLOEXEC) = 0 
10:30:17.940652 rt_sigaction(SIGPIPE, {0x1, ~[ILL ABRT BUS FPE SEGV USR2 TERM XCPU XFSZ SYS RTMIN RT_1], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f7198b2b920}, {0x1, [PIPE], SA_RESTORER|SA_RESTART, 0x7f7198b2b920}, 8) = 0 
10:30:17.940725 write(8, "\x00\xe8\x00\x00\x01\x00\x00\x00\x01\x3b\x01\x2c\x0c\x41\x20\x00\xff\xff\x7f\x08\x00\x00\x01\x00\x00\xa2\x00\x46\x00\x00\x08\x00"..., 232) = 232 
10:30:17.940781 read(8, "\x00\x08\x00\x00\x0b\x00\x00\x00", 8208) = 8 
10:30:17.974177 write(8, "\x00\xe8\x00\x00\x01\x00\x00\x00\x01\x3b\x01\x2c\x0c\x41\x20\x00\xff\xff\x7f\x08\x00\x00\x01\x00\x00\xa2\x00\x46\x00\x00\x08\x00"..., 232) = 232 
10:30:17.974247 read(8, "\x00\x29\x00\x00\x02\x00\x00\x00\x01\x3b\x0c\x41\x00\x00\x00\x00\x01\x00\x00\x00\x00\x29\x51\x41\x00\x00\x00\x00\x00\x00\x00\x00"..., 8208) = 41 
10:30:17.976465 write(8, "\x00\x00\x00\xa4\x06\x20\x00\x00\x00\x00\xde\xad\xbe\xef\x00\x9a\x00\x00\x00\x00\x00\x04\x00\x00\x04\x00\x03\x00\x00\x00\x00\x00"..., 164) = 164 
.... 

これは、それがどのように見えるかですすべてが正常に動作しないとき:

10:23:24.888170 connect(8, {sa_family=AF_INET, sin_port=htons(1521), sin_addr=inet_addr("10.1.1.55")}, 16) = -1 EINPROGRESS (Operation now in progress) 
10:23:24.888241 times(NULL)    = 2908548738 
10:23:24.888263 brk(0xda4000)   = 0xda4000 
10:23:24.888287 poll([{fd=8, events=POLLOUT}], 1, 60000) = 1 ([{fd=8, revents=POLLOUT}]) 
10:23:24.889769 getsockopt(8, SOL_SOCKET, SO_ERROR, [519270883345301504], [4]) = 0 
10:23:24.889807 fcntl(8, F_GETFL)  = 0x802 (flags O_RDWR|O_NONBLOCK) 
10:23:24.889827 fcntl(8, F_SETFL, O_RDWR) = 0 
10:23:24.889845 getsockname(8, {sa_family=AF_INET, sin_port=htons(62473), sin_addr=inet_addr("192.168.22.30")}, [16]) = 0 
10:23:24.889873 getsockopt(8, SOL_SOCKET, SO_SNDBUF, [-8374476973480591360], [4]) = 0 
10:23:24.889892 getsockopt(8, SOL_SOCKET, SO_RCVBUF, [-8374476973480520364], [4]) = 0 
10:23:24.889915 setsockopt(8, SOL_TCP, TCP_NODELAY, [1], 4) = 0 
10:23:24.889936 fcntl(8, F_SETFD, FD_CLOEXEC) = 0 
10:23:24.890062 rt_sigaction(SIGPIPE, {0x1, ~[ILL ABRT BUS FPE SEGV USR2 TERM XCPU XFSZ SYS RTMIN RT_1], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f2ee24b4920}, {0x1, [PIPE], SA_ 
RESTORER|SA_RESTART, 0x7f2ee24b4920}, 8) = 0 
10:23:24.890129 write(8, "\x00\xe8\x00\x00\x01\x00\x00\x00\x01\x3b\x01\x2c\x0c\x41\x20\x00\xff\xff\x7f\x08\x00\x00\x01\x00\x00\xa2\x00\x46\x00\x00\x08\x00"..., 232) = 232 
10:23:24.890186 read(8, 0xd705a6, 8208) = ? ERESTARTSYS (To be restarted) 
10:23:24.907853 --- SIGHUP (Hangup) @ 0 (0) --- 
10:23:24.908708 +++ killed by SIGHUP +++ 

これは時々およびアプリケーション(あるいは少なくとも、PHPスクリプトとDBへの接続が)ばかり殺さを発生します。それは良くないね。

  • あなたは上記のストレスをどうやって作っていますか?
  • 誰が誰によって殺されたのかを教えてもらえますか?
  • なぜread()がERESTARTSYSを返しますか?
  • SIGHUP (Hangup) @ 0 (0)は正確に何を教えてくれるのですか?
+0

本当に誰かがあなたのPHPスクリプトにSIGHUPを送り、それを殺したということです。これはWebサーバー内で実行されているのですか、または他のコンテキストでPHPスクリプトを実行していますか?(制御ターミナルttyが閉じられたときにもSIGHUPが送信されます) – nos

+0

PHPバイナリは別のアプリケーションから呼び出されます。おそらくアプリケーションが途中で終了し、PHPに終了する時間が与えられないでしょうか? – Marki

答えて

1

あなたのプロセスにはSIGHUPが送信されました。これにより、正常に終了しました。

誰がそれをしたのかわかりません。新しいバージョンのstraceを試してみてください。私が言うことから、2011年からバージョン4.6に戻っていくと、より多くの情報が表示されるはずです。使用しているstraceのバージョンは2011年以前のもので、@ 0 (0)は信号を受信したときのプロセスのPCと信号に関連付けられたアドレスをsiginfo_tから提供します。どちらもこの問題について何も教えてくれません。

新しいバージョンでは、このようなものを供給します:

--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=25064, si_uid=1000} --- 
--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} --- 

この最初はSIGHUPを送信して別のプロセスです。 2番目は、特定のイベントのために自動的に送信されるものです。

後者は、プロセスの制御端末が終了したとき、またはセッションリーダーが終了したためにセッションリーダーが終了したときに発生します。カーネルがシグナルを送信していると判断したら、実行中のプロセスを見て、ps出力の "sid"と "tty"列を調べます。それはSIGHUPを送信させる原因となるセッションリーダーと端末を教えてくれます。スクリプトに制御端末があり、時にはそうでないことがありますか?

セッションリーダーは、通常、あなたのスクリプトを開始した親プロセス、またはそのプロセスの親、またはその親などです。ps出力を見ると "sid"が表示されます。リーダープロセスが終了し、制御端末を持っている場合、その下のすべてがSIGHUPになります。これを解決する方法は、PHPプロセスが終了するまでリーダーが終了しないようにするか、ある時点でそのセッションや端末から切り離すことです。通常、デーモンまたはサーバプロセスは端末に関連付けられてはなりません。 daemon()およびsetsid()を参照してください。

+0

'#rpm -qa | grep strace' 'strace-4.5.18-10.22.1' – Marki

+1

私は自分が思ったソースを見ていてはいけません。このバージョンでは、信号が受信されたアドレスと、信号に関連付けられたアドレスが、あたかもsegフォルトのように印刷されています。どちらもあなたにとって役に立ちません。追加情報は、2011年からバージョン4.6で追加されました。 – TrentP

関連する問題