好吧这可能是一个很难的,我有一个pyGTK应用程序,由于我无法捕获/控制的X Window错误导致随机崩溃.
所以我创建了一个包装器,一旦检测到崩溃就重新启动应用程序,现在出现了问题,当用户注销或关闭系统时,应用程序以状态1退出.但是在某些X错误上它也会这样做.
所以我尝试了任何事情以捕获关闭/注销,但没有成功,这是我尝试过的:
import pygtk
import gtk
import sys
class Test(gtk.Window):
def delete_event(self, widget, event, data=None):
open("delete_event", "wb")
def destroy_event(self, widget, data=None):
open("destroy_event", "wb")
def destroy_event2(self, widget, event, data=None):
open("destroy_event2", "wb")
def __init__(self):
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
self.show()
self.connect("delete_event", self.delete_event)
self.connect("destroy", self.destroy_event)
self.connect("destroy-event", self.destroy_event2)
def foo():
open("add_event", "wb")
def ex():
open("sys_event", "wb")
from signal import *
def clean(sig):
f = open("sig_event", "wb")
f.write(str(sig))
f.close()
exit(0)
for sig in (SIGABRT, SIGILL, SIGINT, SIGSEGV, SIGTERM):
signal(sig, lambda *args: clean(sig))
def at():
open("at_event", "wb") …Run Code Online (Sandbox Code Playgroud) 我不明白为什么我要提出这个致命的例外.它工作得很好localhost.
我知道这SIGTERM只是一个终止程序的信号,我不相信解决方案是处理或忽略它.
当我查看部署的网站时,它显示为白页.如何修复此错误以便我的应用程序可以正常显示?
这是我的Heroku日志:
2014-04-23T20:59:57.995734+00:00 app[web.1]: /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/webrick/server.rb:170:in `block in start'
2014-04-23T20:59:57.995789+00:00 app[web.1]: /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/webrick/server.rb:32:in `start'
2014-04-23T20:59:57.995875+00:00 app[web.1]: /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/webrick/server.rb:160:in `start'
2014-04-23T20:59:57.995933+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/webrick.rb:14:in `run'
2014-04-23T20:59:57.995988+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:264:in `start'
2014-04-23T20:59:57.996042+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/railties-4.0.4/lib/rails/commands/server.rb:84:in `start'
2014-04-23T20:59:57.996552+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/railties-4.0.4/lib/rails/commands.rb:71:in `<top (required)>'
2014-04-23T20:59:57.996843+00:00 app[web.1]: [2014-04-23 20:59:57] INFO WEBrick::HTTPServer#start done.
2014-04-23T20:59:57.996932+00:00 app[web.1]: Exiting
2014-04-23T20:59:57.996466+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/railties-4.0.4/lib/rails/commands.rb:71:in `tap'
2014-04-23T20:59:57.996333+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/railties-4.0.4/lib/rails/commands.rb:76:in `block in <top (required)>'
2014-04-23T20:59:57.996777+00:00 app[web.1]: [2014-04-23 20:59:57] INFO going to shutdown ...
2014-04-23T20:59:57.996607+00:00 app[web.1]: bin/rails:4:in `require'
2014-04-23T20:59:57.996688+00:00 app[web.1]: bin/rails:4:in `<main>'
2014-04-23T20:59:59.247265+00:00 …Run Code Online (Sandbox Code Playgroud) 是否有可能在 Golang 中捕获 asigterm并继续执行代码,就像恐慌/延迟一样?
例子:
func main() {
fmt.Println("app started")
setupGracefulShutdown()
for {
}
close()
}
func close() {
fmt.Println("infinite loop stopped and got here")
}
func setupGracefulShutdown() {
sigChan := make(chan os.Signal)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
go func() {
fmt.Println(" got interrupt signal: ", <-sigChan)
}()
}
// "app started"
// CTRL + C
// ^C "got interrupt signal: interrupt"
// app don't stop
Run Code Online (Sandbox Code Playgroud)
我想要的是打印infinite loop stopped and got here并完成申请。
// "app started"
// CTRL + …Run Code Online (Sandbox Code Playgroud) 我有一个由GUI应用程序运行的控制台守护程序.当GUI应用程序终止时,我也想停止守护进程.
我如何在Windows上以温和的方式做到这一点?
在Linux上,我只是使用SIGTERM在Windows上是否有类似的机制用于控制台应用程序?
为了提供更多细节,守护进程应用程序是用python编写的,gui是用C#和windows表单编写的.
我希望能够在docker容器中运行node,然后才能运行docker stop <container>.这应该停止容器,SIGTERM而不是超时和做SIGKILL.不幸的是,我似乎错过了一些东西,我发现的信息似乎与其他部分相矛盾.
这是一个测试Dockerfile:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y curl
RUN curl -sSL http://nodejs.org/dist/v0.11.14/node-v0.11.14-linux-x64.tar.gz | tar -xzf -
ADD test.js /
ENTRYPOINT ["/node-v0.11.14-linux-x64/bin/node", "/test.js"]
Run Code Online (Sandbox Code Playgroud)
这是test.jsDockerfile中引用的:
var http = require('http');
var server = http.createServer(function (req, res) {
console.log('exiting');
process.exit(0);
}).listen(3333, function (err) {
console.log('pid is ' + process.pid)
});
Run Code Online (Sandbox Code Playgroud)
我这样构建它:
$ docker build -t test .
Run Code Online (Sandbox Code Playgroud)
我像这样运行它:
$ docker run --name test -p 3333:3333 -d test
Run Code Online (Sandbox Code Playgroud)
然后我跑:
$ docker …Run Code Online (Sandbox Code Playgroud) 假设我们有一个用Java编写的琐碎的守护程序:
public class Hellow {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
while(true) {
// 1. do
// 2. some
// 3. important
// 4. job
// 5. sleep
}
}
}
Run Code Online (Sandbox Code Playgroud)
我们将其守护进程start-stop-daemon默认情况下使用以下命令发送SIGTERM(TERM)信号:--stop
假设当前执行的步骤是#2。此时此刻,我们正在发送TERM信号。
发生的事情是执行立即终止。
我发现我可以使用处理信号事件,addShutdownHook()但事实是它仍然会中断当前执行并将控件传递给处理程序:
public class Hellow {
private static boolean shutdownFlag = false;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application …Run Code Online (Sandbox Code Playgroud) 我有一个使用 uvicorn 的 Python FastAPI 应用程序。我把它打包在 docker 容器中。当我使用如下命令运行应用程序(在 Windows 10 计算机上的 Power Shell 中)时:docker run -p 8080:8080 my-image-name我收到以下 uvicorn 启动文本:
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
Run Code Online (Sandbox Code Playgroud)
当我按CTRL+C杀死该应用程序时,什么也没有发生。我总是最终不得不关闭终端才能让它停止。
这是因为它在 docker 容器中运行吗?
我知道我可以在分离模式 ( ) 下运行容器-d,但有时我想在容器日志发生时观察它们。
如何终止 docker 映像和 uvicorn 进程并保持终端仍在运行?
是否有一种方法可以自动延迟所有Kubernetes pod 删除请求,以便发出端点注销信号,但 pod 的 SIGTERM 延迟几秒?
如果延迟仅影响具有端点/服务的 Pod,则更好,但不是必需的。
背景:
众所周知,由于端点注销和删除信号的异步特性,在 向Pod 发送 SIGTERM 终止信号后,某些流量可以继续流向 Pod 。建议的缓解措施是通过调用 来在 pod 的生命周期挂钩中引入几秒钟的延迟。preStopsleep
如果 pod 的部署可以通过 helm 或其他上游源完成,或者需要管理大量的部署和容器,那么困难很快就会出现。以这种方式修改许多部署可能很困难,甚至不可能(例如,容器可能没有睡眠二进制文件、shell 或除应用程序可执行文件之外的任何内容)。
我简要地探索了一个变异准入控制器,但这似乎无法动态添加preStop钩子,因为所有图像都没有/bin/sleep或已经有preStop可能需要特定于图像的知识来合并。
(当然,如果 K8S API 使端点注销与超时同步以避免死锁(提示,提示),那么所有这一切都可以避免,但我还没有看到任何关于此类更改的讨论。是的,有很多这是不同步的原因,但这并不意味着无法完成某些操作。)
我有一个 docker 入口点脚本,该脚本应该捕获发送到容器中进程的信号。主要应用程序是 tomcat - 嵌入在 docker-entrypoint.sh 中的 java 进程,该进程被传递给 dumb-init。容器中的流程映射如下所示:
root@mycontainer:/usr/local/tomcat/webapps/datarouter-example# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 05:21 ? 00:00:00 dumb-init -- /docker-entrypoint.sh
root 6 1 0 05:21 ? 00:00:00 bash /docker-entrypoint.sh
root 14 6 1 05:21 ? 00:08:57 /jdk-13.0.1/bin/java -Djava.util.logging.config.file=....
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM maven:3.6.3-jdk-13 as maven_builder
WORKDIR /app
COPY . /app
RUN ["mvn","clean","install","-T","2C","-DskipTests=true"]
FROM tomcat:9.0.31-jdk13-openjdk-buster
ARG dumbInitVersion='1.2.2'
# install dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
sudo \ …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试了解 Django 中收到 SIGTERM 时的信号处理。
我有一个可能需要长时间运行的请求的应用程序,在 Docker 容器中运行。当Docker想要停止一个容器时,它首先发送一个SIGTERM信号,等待一段时间,然后发送一个SIGKILL。通常,在 SIGTERM 上,您停止接收新请求,并希望当前正在运行的请求在 Docker 决定发送 SIGKILL 之前完成。但是,在我的应用程序中,我想保存已尝试过的请求,并发现这比立即完成请求更重要。因此,我更喜欢在 SIGTERM 上关闭当前请求,以便我可以优雅地结束它们(并保存它们的状态),而不是等待 SIGKILL。
我的理论是,您可以为 SIGTERM 注册一个信号监听器,该监听器执行sys.exit(),以便SystemExit引发异常。然后我想在我的请求处理程序中捕获该异常,并保存我的状态。作为第一个实验,我为 Django 开发服务器创建了一个模拟项目。我在函数中注册了信号Appconfig.ready():
import signal
import sys
from django.apps import AppConfig
import logging
logger = logging.getLogger(__name__)
def signal_handler(signal_num, frame):
sys.exit()
class TesterConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'tester'
def ready(self):
logger.info('starting ready')
signal.signal(signal.SIGTERM, signal_handler)
Run Code Online (Sandbox Code Playgroud)
并创建了一个捕获异常和 BaseException 的请求处理程序:
import logging
import sys
import time
from django.http import HttpResponse
def handler(request):
try:
logger.info('start')
while True: …Run Code Online (Sandbox Code Playgroud)