当前位置: 首页 > 知识库问答 >
问题:

发送SIGTERM时,子进程是否关闭mysql连接?

黄宏旷
2023-03-14

请想象一些子进程是由pcntl_fork()生成的,它们分别使用PDO打开mysql连接。如果父进程向子进程发送带有posix_kill()的SIGTERM信号,子进程将立即被杀死。

所以,我对此有一个疑问。当子进程终止时,它是否也会自动关闭mysql连接?或者我应该调用out()函数

我知道如果发送了SIGKILL,子进程会保持连接。但是,我不知道SIGTERM的情况。

共有2个答案

查宜修
2023-03-14

SIGKILL从内存中删除进程,而不进行任何清理。操作系统应该清理所有打开的句柄,但是可能会发生数据库连接保持打开的情况(至少在数据库注意到死连接之前)。

它不应该从应用程序中使用,而应该作为最后手段从控制台中使用。

您应该使用SIGTERM或SIGINT,以便子进程正确退出并关闭所有打开的句柄。

云承天
2023-03-14

当一个进程完成时(要么是因为它退出,要么是因为它使用信号终止),它保持打开的所有文件和连接都会被操作系统自动关闭。通过使用MySQL协议关闭连接(假设有一个),它并没有干净地关闭。在TCP/IP级别简单地删除它,另一侧的服务器只是发现它正在与一扇关闭的门交谈。这并不总是立即发生,有时需要一些时间,直到服务器注意到讨论伙伴离开。当这种情况发生时,它会认为连接已被删除,并清理它这边的东西。

在使用< code>fork()之前,不要在父进程中打开MySQL连接。< code>fork()复制用于管理连接本地端的数据结构,结果不可预测。更重要的是,当子进程完成时(无论如何),它关闭连接(或者操作系统断开连接),MySQL服务器也关闭它的一端,父进程发现它没有和任何人说话。

在使用< code>fork()之前关闭父进程中的MySQL连接,然后根据需要在父进程和子进程中打开单独的连接。

此外,在父进程中包装与服务器的任何MySQL通信:

pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));

pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));

否则,当子进程完成时,将使用 SIGCHLD 信号通知父进程。接收到的信号将其从睡眠状态恢复(如果信号到达时碰巧在 sleep() 调用中停止)。MySQL库使用sleep()作为MySQL协议的一部分,与服务器进行通信。如果这样的 sleep() 强行返回的时间早于预期(因为接收到的信号),MySQL 库就会感到困惑,最终会报告奇怪的错误(如“MySQL 服务器消失了”),这些错误实际上是不正确的。

请看一下这个答案,以获得详细的解释。

 类似资料:
  • 问题内容: 尽管JVM会将SIGTERM和类似的信号转换为关闭挂钩,但是许多服务关闭脚本使用TCP端口启动关闭。(例如,Tomcat的关闭端口,Java Service Wrapper ,JBoss的管理接口等) 所以我认为不建议使用信号和关闭钩子来正常关闭Java服务,直到发现Play!框架通过关闭钩子管理服务生命周期,并且由生成的启动脚本假定将信号发送到JVM的PID。 我知道信号是与平台相关

  • 问题内容: 我有一个使用简单套接字在两个系统之间传递某些字符的应用程序。我的Java应用程序作为服务器运行。我建立了良好的连接,甚至传递了一条消息。但是,发送完一条消息后,我的连接关闭。 从我可以看出来的好像是在关闭时,套接字本身正在关闭吗?!这很不好,因为我有多个要在同一连接上发送的消息。 我吃饱了吗?如何在Java中维护此连接? 问题答案: 是的,关闭任何作家/读者将关闭他们包装的所有其他作家

  • 我有一个使用SpringLDAP 1.3.1的应用程序。它在启动时在Spring上下文中创建LdapTemplate,并将其传递给我的应用程序。我连接的LDAP字符串实际上是一个VIP设备,后面有多个Active Directory服务器。 该应用程序用于创建组层次结构,并分几个步骤进行。首先,它创建任何新组,然后删除任何删除的组,然后更新和更改组,最后更新任何新组或移动组的父级。 在最后一步中,

  • 我读过很多帖子,人们说在java、语句等中关闭连接,但我没有找到我的问题的答案。 我问我不做Con.close(),但我做所以它会关闭连接或不? 所以我只想知道,当我们关闭结果集时,连接是否会关闭?

  • 问题内容: 我有一个C / Windows程序,该程序通过WM_COPYDATA消息从另一个C 程序接收数据。然后应该使用Sockets / winsock将此消息发送到用Java编写的服务器上。客户端可以很好地连接到服务器,但是它似乎无法及时发送消息。但是,一旦客户端关闭,它应该已经发送的所有消息都会一次性发送出去。这是Java服务器的终端输出示例: 发生这些事件时,Java服务器将输出前两行。

  • 当应用程序完全关闭时,如何以编程方式发送通知? 示例:用户关闭应用程序,也在Android Taskmanager中,然后等待。应用程序应在X秒后或应用程序检查更新时发送通知。 我试图使用这些代码示例,但是: 应用程序关闭时推送通知-活动太多/无法工作 我如何让我的应用程序在关闭时发送通知很多信息,但我不知道如何处理 当android应用程序关闭时,如何发送本地通知?-很多信息,但我不知道如何处理