我想捕获从控制台发送的Ctrl+C(SIGINT)信号并打印出一些部分运行总计.
这在Golang有可能吗?
注意:当我第一次发布问题时,我很困惑Ctrl+C而SIGTERM不是SIGINT.
让我们假设我们有一个用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()有机会停止正常?
除非绝对必要,否则不要使用kill -9!SIGKILL无法被捕获,因此被杀死的程序无法运行任何关闭例程来例如擦除临时文件.首先尝试HUP(1),然后是INT(2),然后是QUIT(3)
我原则上同意SIGKILL,但其余的对我来说都是新闻.鉴于发送的默认信号kill是SIGTERM,我预计它是任意进程正常关闭的最常见信号.此外,我已经看到SIGHUP用于非终止原因,例如告诉守护程序"重新读取您的配置文件".而且在我看来SIGINT(你通常用Ctrl-C得到的中断,对吗?)并没有得到应有的广泛支持,或者相当不合适地终止.
鉴于这SIGKILL是最后的手段 - 您应该向任意进程发送哪些信号以及以何种顺序发送信号,以便尽可能优雅地关闭它?
如果可以,请用支持事实(超出个人偏好或意见)或参考资料证实您的答案.
注意:我对包括考虑bash/Cygwin的最佳实践特别感兴趣.
编辑:到目前为止,似乎没有人提到INT或QUIT,并且有限提及HUP.是否有任何理由将这些包括在有序的过程中?
这种情况刚刚开始三周左右.我的网站内容没有改变,它只是一个使用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 …
默认情况下,如果Python收到SIGTERM但没有注册信号处理程序,那么它在默认情况下做了什么?
我正在开发一个需要检测系统关闭的应用程序.但是,我没有找到任何可靠的方式来获取此事件的通知.
我知道在关机时,我的应用程序会收到一个SIGTERM信号后跟一个SIGKILL.我想知道是否有任何方法可以查询a SIGTERM是否是关闭序列的一部分?
有没有人知道是否有办法以编程方式查询(C API)?
据我所知,系统没有提供任何其他方法来查询即将发生的关机.如果是这样,那也可以解决我的问题.我也一直在尝试runlevels,但改变runlevels似乎是即时的,没有任何预先警告.
我对此做了大量的研究,我很惊讶我还没有找到一个好的答案.
我正在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) 在Linux中,当我在java.lang.Process对象上运行destroy函数(这是真正的类型java.lang.UNIXProcess)时,它会发送一个SIGTERM信号进行处理,有没有办法用SIGKILL来杀死它?
我的目录中有以下两个文件:
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?