标签: sigterm

在Linux下检测Python/GTK中的用户注销/关闭 - 未收到SIGTERM/HUP

好吧这可能是一个很难的,我有一个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)

python linux gtk pygtk sigterm

7
推荐指数
1
解决办法
3601
查看次数

Heroku记录FATAL SignalException:SIGTERM

我不明白为什么我要提出这个致命的例外.它工作得很好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)

deployment ruby-on-rails heroku sigterm

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

Golang捕获sigterm并继续应用

是否有可能在 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)

signals go sigterm

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

Windows上有posix SIGTERM替代品吗? - (轻轻杀死控制台应用程序)

我有一个由GUI应用程序运行的控制台守护程序.当GUI应用程序终止时,我也想停止守护进程.

我如何在Windows上以温和的方式做到这一点?

在Linux上,我只是使用SIGTERM在Windows上是否有类似的机制用于控制台应用程序?

为了提供更多细节,守护进程应用程序是用python编写的,gui是用C#和windows表单编写的.

.net c# windows winapi sigterm

6
推荐指数
1
解决办法
5916
查看次数

docker stop对节点进程不起作用

我希望能够在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)

ubuntu node.js sigterm docker

6
推荐指数
1
解决办法
1575
查看次数

如何在Java中正常处理SIGTERM信号?

假设我们有一个用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)

java daemon process sigterm start-stop-daemon

6
推荐指数
1
解决办法
2414
查看次数

Uvicorn 不会用 CTRL+C 退出

我有一个使用 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 进程并保持终端仍在运行?

sigterm docker uvicorn

6
推荐指数
1
解决办法
4742
查看次数

Kubernetes 中自动 Pod 删除延迟

是否有一种方法可以自动延迟所有Kubernetes pod 删除请求,以便发出端点注销信号,但 pod 的 SIGTERM 延迟几秒?

如果延迟仅影响具有端点/服务的 Pod,则更好,但不是必需的。

背景:

众所周知由于端点注销和删除信号的异步特性, Pod 发送 SIGTERM 终止信号后,某些流量可以继续流向 Pod 。建议的缓解措施是通过调用 来在 pod 的生命周期挂钩中引入几秒钟的延迟。preStopsleep

如果 pod 的部署可以通过 helm 或其他上游源完成,或者需要管理大量的部署和容器,那么困难很快就会出现。以这种方式修改许多部署可能很困难,甚至不可能(例如,容器可能没有睡眠二进制文件、shell 或除应用程序可执行文件之外的任何内容)。

我简要地探索了一个变异准入控制器,但这似乎无法动态添加preStop钩子,因为所有图像都没有/bin/sleep或已经有preStop可能需要特定于图像的知识来合并。

(当然,如果 K8S API 使端点注销与超时同步以避免死锁(提示,提示),那么所有这一切都可以避免,但我还没有看到任何关于此类更改的讨论。是的,有很多这是不同步的原因,但这并不意味着无法完成某些操作。)

deadlock sigterm kubernetes

5
推荐指数
1
解决办法
3310
查看次数

无法在 docker 入口点脚本中捕获信号

我有一个 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)

wait sigterm docker bash-trap tomcat9

5
推荐指数
1
解决办法
6156
查看次数

如何在 Django 请求处理程序线程中的 SIGTERM 上执行代码

我目前正在尝试了解 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)

python django sigterm

5
推荐指数
1
解决办法
1871
查看次数