标签: sigterm

是否可以以"延迟"的方式捕获Ctrl + C信号并运行清理功能?

我想捕获从控制台发送的Ctrl+C(SIGINT)信号并打印出一些部分运行总计.

这在Golang有可能吗?

注意:当我第一次发布问题时,我很困惑Ctrl+CSIGTERM不是SIGINT.

signals go sigterm

191
推荐指数
5
解决办法
9万
查看次数

如何优雅地处理SIGTERM信号?

让我们假设我们有一个用python编写的这样一个简单的守护进程:

def mainloop():
    while True:
        # 1. do
        # 2. some
        # 3. important
        # 4. job
        # 5. sleep

mainloop()
Run Code Online (Sandbox Code Playgroud)

然后我们使用start-stop-daemon默认的send SIGTERM(TERM)信号进行守护--stop.

我们假设当前执行的步骤是#2.在这个时刻,我们正在发送TERM信号.

会发生什么是执行立即终止.

我发现我可以处理信号事件,signal.signal(signal.SIGTERM, handler)但问题是它仍然会中断当前执行并将控制传递给handler.

所以,我的问题是-它可以不中断当前执行,但处理TERM(?)在独立的线程信号,使我能够设置shutdown_flag = True,使mainloop()有机会停止正常?

python daemon sigterm start-stop-daemon

177
推荐指数
6
解决办法
13万
查看次数

我应该以什么顺序发送信号以正常关闭进程?

评论这个答案的另一个问题,该评论说:

除非绝对必要,否则不要使用kill -9!SIGKILL无法被捕获,因此被杀死的程序无法运行任何关闭例程来例如擦除临时文件.首先尝试HUP(1),然后是INT(2),然后是QUIT(3)

我原则上同意SIGKILL,但其余的对我来说都是新闻.鉴于发送的默认信号killSIGTERM,我预计它是任意进程正常关闭的最常见信号.此外,我已经看到SIGHUP用于非终止原因,例如告诉守护程序"重新读取您的配置文件".而且在我看来SIGINT(你通常用Ctrl-C得到的中断,对吗?)并没有得到应有的广泛支持,或者相当不合适地终止.

鉴于这SIGKILL是最后的手段 - 您应该向任意进程发送哪些信号以及以何种顺序发送信号,以便尽可能优雅地关闭它?

如果可以,请用支持事实(超出个人偏好或意见)或参考资料证实您的答案.

注意:我对包括考虑bash/Cygwin的最佳实践特别感兴趣.

编辑:到目前为止,似乎没有人提到INT或QUIT,并且有限提及HUP.是否有任何理由将这些包括在有序的过程中?

bash signals job-control sigterm

80
推荐指数
4
解决办法
2万
查看次数

如何处理SIGTERM

Java中是否有办法处理收到的SIGTERM?

java exit sigterm

60
推荐指数
3
解决办法
4万
查看次数

Apache服务器不断崩溃,"抓住SIGTERM,关闭"

这种情况刚刚开始三周左右.我的网站内容没有改变,它只是一个使用MySQL作为后端的phpBB论坛.

在一年多的时间里没有任何改变,但是最近,每两天左右,服务器只关闭而根本无法访问,我必须通知我的服务提供商实际重启机器.

它似乎与我在日志中发现的这些SIGTERM错误有关.问题是我不知道如何解决这些问题或找到根本原因,因为我缺乏这方面的技能.

任何人都有任何想法可能会发生什么?

Apache/2.2.3(CentOS)

20051115

Linux 2.6.18-028stab057.4#1 SMP Fri Aug 1 10:47:59 MSD 2008 x86_64

从错误日志:[Sun Nov 01 15:18:53 2009] [通知]抓住了SIGTERM,关闭了

不完全确定是什么导致了我的问题,但这听起来不是一件好事.

如果需要,我可以发布更多日志信息

[Sun Nov 01 05:07:17 2009] [notice] Digest: generating secret for digest authentication ...
[Sun Nov 01 05:07:17 2009] [notice] Digest: done
[Sun Nov 01 05:07:19 2009] [notice] mod_python: Creating 4 session mutexes based on 10 max processes and 0 max threads.
[Sun Nov 01 05:07:19 2009] [warn] RSA server certificate CommonName (CN) `plesk' does NOT match …

linux apache crash sigterm

51
推荐指数
2
解决办法
19万
查看次数

Python:SIGTERM的默认处理是什么?

默认情况下,如果Python收到SIGTERM但没有注册信号处理程序,那么它在默认情况下做了什么?

python signals sigterm

31
推荐指数
2
解决办法
7156
查看次数

如何在Linux上检测挂起的系统关闭?

我正在开发一个需要检测系统关闭的应用程序.但是,我没有找到任何可靠的方式来获取此事件的通知.

我知道在关机时,我的应用程序会收到一个SIGTERM信号后跟一个SIGKILL.我想知道是否有任何方法可以查询a SIGTERM是否是关闭序列的一部分

有没有人知道是否有办法以编程方式查询(C API)?

据我所知,系统没有提供任何其他方法来查询即将发生的关机.如果是这样,那也可以解决我的问题.我也一直在尝试runlevels,但改变runlevels似乎是即时的,没有任何预先警告.

c linux system-shutdown sigterm

20
推荐指数
4
解决办法
2万
查看次数

在Celery工作者中捕获Heroku SIGTERM以优雅地关闭工作人员

我对此做了大量的研究,我很惊讶我还没有找到一个好的答案.

我正在Heroku上运行一个大型应用程序,我有一些芹菜任务运行了很长时间的处理,并在任务结束时保存结果.每次我在Heroku上重新部署时,它都会发送SIGTERM(最终是SIGKILL)并杀死我的跑步工作者.我正在尝试找到一种方法让worker实例优雅地自行关闭并重新排队以便稍后处理,这样最终我们可以保存所需的结果而不是丢失排队的任务.

我找不到一种让工作人员正确地监听SIGTERM的方法.我得到的最接近的,在python manage.py celeryd直接运行时有效但在使用工头模拟Heroku时没有,如下:

@app.task(bind=True, max_retries=1)
def slow(self, x):
    try:
        for x in range(100):
            print 'x: ' + unicode(x)
            time.sleep(10)
    except exceptions.MaxRetriesExceededError:
        logger.error('whoa')
    except (exceptions.WorkerShutdown, exceptions.WorkerTerminate) as exc:
        logger.error(u'retrying, ' + unicode(exc))
        raise self.retry(exc=exc, countdown=10)
    except (KeyboardInterrupt, SystemExit) as exc:
        print 'retrying'
        raise self.retry(exc=exc, countdown=10)
    else:
        return x
    finally:
        logger.info('task ended!')
Run Code Online (Sandbox Code Playgroud)

当我开始在领班内运行芹菜任务并按Ctrl + C时,会发生以下情况:

^CSIGINT received
22:20:59 system   | sending SIGTERM to all processes
22:20:59 web.1    | exited with code 0
22:21:04 system   | sending …
Run Code Online (Sandbox Code Playgroud)

python heroku rabbitmq celery sigterm

19
推荐指数
1
解决办法
1518
查看次数

如何使用SIGKILL杀死java中的Linux进程Process.destroy()执行SIGTERM

在Linux中,当我在java.lang.Process对象上运行destroy函数(这是真正的类型java.lang.UNIXProcess)时,它会发送一个SIGTERM信号进行处理,有没有办法用SIGKILL来杀死它?

java linux kill process sigterm

16
推荐指数
2
解决办法
2万
查看次数

Docker bash shell 脚本无法捕获 SIGINT 或 SIGTERM

我的目录中有以下两个文件:

Dockerfile

FROM debian

WORKDIR /app
COPY start.sh /app/

CMD ["/app/start.sh"]
Run Code Online (Sandbox Code Playgroud)

start.sh(使用权限 755 chmod +x start.sh

FROM debian

WORKDIR /app
COPY start.sh /app/

CMD ["/app/start.sh"]
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令:

$ docker build . -t tmp
$ docker run --name tmp tmp
Run Code Online (Sandbox Code Playgroud)

然后我期望按 Ctrl+C 会向程序发送 SIGINT,该程序会将 SIGINT 打印到屏幕然后退出,但这并没有发生。

我还尝试运行$ docker stop tmp,我希望它会向程序发送一个 SIGTERM ,但$ docker logs tmp之后检查显示 SIGTERM 未被捕获。

为什么 bash 脚本没有捕获 SIGINT 和 SIGTERM?

bash shell sigint sigterm docker

15
推荐指数
2
解决办法
1万
查看次数