gpt4 book ai didi

linux - 如何安全地停止生产中的程序

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:10 25 4
gpt4 key购买 nike

我们有多台机器作为“服务器”运行。在它们上面,他们有一个程序可以监听不同客户端的请求。

在持续部署过程的一部分中,更新服务器程序可能会导致未完成的业务被终止。这是不希望的。我正在寻找一种方法来耗尽一个节点的工作,以便我们可以在另一个节点获得负载时更新它。

至于代表我当前心态的更具体问题:

如何发送“信号”:

while True and no_signal:
do_server_work()

如果我们需要升级它就会停止。

对于我们的基础设施,我们有许多客户端向多个 RabbitMQ 节点发送请求,服务器在这些节点上使用其队列。

编辑:在 Linux 上,使用 python3

最佳答案

(我猜你使用的是 Linux,或者至少是 POSIX 机器)

对于编写良好的服务器程序,您应该向它们发送一个 SIGTERM 信号(有关详细信息,请参阅 signal(7))以温和地终止它们,并且它们应该显式(并且聪明)处理该信号。常见的方法是使用 kill(1)程序(或底层 kill(2) 系统调用)。

编写得不好的服务器程序可能无法按应有的方式处理SIGTERM。然后(几秒钟后)您可能需要使用 SIGKILL 杀死它们,但这可能会使它们(或其文件)处于某种不一致的状态,因为 SIGKILL 无法被捕获。

一些服务器程序被记录为行为不同。例如,他们可能会使用其他一些 inter-process communication设施被要求温和地终止。

正确处理SIGTERM是一种广泛使用的约定(但如果您正在编写处理它的服务器代码,也请阅读signal-safety(7))。有些服务器可能有不同的服务器。

顺便说一句,在 C 级别编写安全信号处理程序有几个技巧(仔细阅读 signal-safety(7) )。一种是拥有一个由信号处理程序设置的全局 volatile sig_atomic_t 变量,并在代码中(可能在 event loops 中)定期测试。另一种方法是设置(在初始化时,使用 pipe(2) )一个 pipe(7)给自己,让你的信号处理程序 write(2)一个或几个字节(这是合法的,因为 write(2) 是一个异步信号安全函数)并到 poll(2)read(2)事件循环中的那个管道。后面的技巧很常见,可以是 documented在 Qt 中。

Python 可能会处理 signals使用第一个技巧或类似的东西(可能与其臭名昭著的 GIL 有关)。既然是free software ,你可以研究一下它的源代码(现在我太懒了)。

关于linux - 如何安全地停止生产中的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48543178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com