首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SIGHUP在读取返回ERESTARTSYS后终止的进程

SIGHUP在读取返回ERESTARTSYS后终止的进程
EN

Stack Overflow用户
提问于 2017-01-27 10:08:34
回答 1查看 732关注 0票数 0

我们有一些应用程序,它调用一个PHP脚本,该脚本连接到Oracle DB来执行某些事情。-有时效果不佳。

我们现在从一开始就通过strace运行PHP部件。

当一切正常时(一切正常,建立DB连接,执行查询,数据库再次断开,等等),情况就是这样的:

代码语言:javascript
复制
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
....

当一切都不正常时,情况就是这样:

代码语言:javascript
复制
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)到底告诉了我们什么?
EN

回答 1

Stack Overflow用户

发布于 2017-01-27 13:11:11

您的进程被发送了一个SIGHUP,这导致了退出的正常操作。

不知道是谁干的。尝试更新版本的strace。据我所知,从2011年开始,一直追溯到4.6版,应该会显示更多的信息。您正在使用的strace版本是2011年之前的版本,@ 0 (0)在接收到信号时向PC提供处理以及与来自siginfo_t的信号相关联的地址。谁也不会告诉你关于这个问题的任何事情。

较新的版本将提供如下内容:

代码语言:javascript
复制
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=25064, si_uid=1000} ---
--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---

这是另一个发送SIGHUP的进程。第二种是由于某些事件而自动发送的。

后者可以发生在进程的控制终端关闭或会话领导因其终端关闭而退出时。如果确定是内核发送信号,那么我会在进程运行时查看它,并检查ps输出中的"sid“和"tty”列。这将告诉您负责导致发送SIGHUP的会话领导和终端。也许有时候你的剧本有一个控制终端,有时却没有?

会话领导者通常是启动脚本的父进程,或者是进程的父进程,或者是进程的父进程,等等。查看ps输出,"sid“会告诉您。如果领导者进程退出并有一个控制终端,那么它下面的所有东西都会得到一个SIGHUP。解决这一问题的方法是要么让领导者在PHP进程完成之前不退出,要么在某个时候与该会话或终端分离。通常,守护进程或服务器进程不应该与终端相关联。见daemon()setsid()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41891406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档