【问题标题】:systemd - Child is receiving a SIGTERM on parent exitsystemd - 孩子在父母退出时收到 SIGTERM
【发布时间】:2016-07-01 06:12:21
【问题描述】:

环境:

我有一个 python 服务器,它分成 3 个孩子。

对于父母:

  • SIGTERM 应该杀死所有孩子,而 SIGHUP 应该记录并存在

对于孩子:

  • SIGTERM 和 SIGHUP 都映射到 SIG_DFL

问题:

当我通过命令行 python <script.py> 启动脚本并将 SIGHUP 发送给父 kill -1 <pid-of-parent> 时,它表现良好。父进程退出,忙碌的子进程只有在完成 I/O 后才会退出。

但是如果使用 systemd 脚本启动相同的脚本,当我向父级发送 SIGHUP 时,仍然忙碌的子级会收到一个 SIGTERM 并导致 I/O 中断。

对此有任何解释/解决方案吗?是不是配置错误?

【问题讨论】:

    标签: python signals systemd sigterm


    【解决方案1】:

    似乎您需要将 systemd 服务的 KillMode 设置为 process

    KillMode ... 指定如何杀死该单元的进程。 ...如果设置为控制组,则该单元控制组中的所有剩余进程将在单元停止时被杀死...如果设置为进程,则仅主进程本身被杀死...默认为控制组

    更多信息:https://www.freedesktop.org/software/systemd/man/systemd.kill.html#

    如果您以这种方式生成进程,另一种方法是在 subprocess.Popen 调用中将 creationflags 设置为 subprocess.CREATE_NEW_PROCESS_GROUP

    【讨论】:

    • 来自文档KillMode 只有在使用service stop 命令停止服务时才有效。就我而言,我直接发送 SIGHUP 。使用该参数的快速测试也显示相同。
    • 您可能也想尝试设置SendSIGKILL=no
    • 我认为所有这些参数只有在单独使用 service 命令管理服务时才有意义。如果直接发送 SIGHUP,则不会出现
    • 如果您提供 MCVE (stackoverflow.com/help/mcve),我会先尝试,但根据您的问题,除了由 systemd 运行之外没有任何区别,所以我认为它会杀死子进程。跨度>
    • 是的,我一直在尝试。删除大量自定义代码后,以下脚本运行 eventlet wsgi 服务器 pastebin.com/8TtN7KZ0 这是对应的 .service 文件 # cat /usr/lib/systemd/system/junk.service [Unit] Description=Junk service for testing purpose [Service] Type=simple ExecStart=/tmp/junk.py [Install] WantedBy=multi-user.target 注意 服务器需要 python-eventlet 包才能运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多