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

2023-11-23

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

import atexit
atexit.register(at)

f = Test()
sys.exitfunc = ex
gtk.quit_add(gtk.main_level(), foo)

gtk.main()
open("exit_event", "wb")

这些都没有成功,是否有任何低级方法来检测系统关闭?谷歌没有找到任何与此相关的内容。

我想一定有办法,对吗? :/

EDIT:好吧,还有更多东西。

我创建了这个 shell 脚本:

#!/bin/bash


trap test_term TERM
trap test_hup HUP


test_term(){
    echo "teeeeeeeeeerm" >~/Desktop/term.info
    exit 0
}

test_hup(){
    echo "huuuuuuuuuuup" >~/Desktop/hup.info
    exit 1
}

while [ true ]
do
    echo "idle..."
    sleep 2
done

还创建了一个 .desktop 文件来运行它:

[Desktop Entry]
Name=Kittens
GenericName=Kittens
Comment=Kitten Script
Exec=kittens
StartupNotify=true
Terminal=false
Encoding=UTF-8
Type=Application
Categories=Network;GTK;
Name[de_DE]=Kittens 

通常,这应该在注销时创建术语文件,并在以 & 启动时创建 hup 文件。但不在我的系统上。 GDM 根本不关心脚本,当我重新登录时,它仍然在运行。

我也尝试过使用shopt -s huponexit,没有成功。

EDIT2:
这里还有一些关于真实代码的更多信息,整个事情看起来像这样:

Wrapper Script, that catches errors and restarts the programm
    -> Main Programm with GTK Mainloop
        -> Background Updater Thread

流程是这样的:

Start Wrapper
-> enter restart loop
    while restarts < max:
        -> start program
            -> check return code
                -> write error to file or exit the wrapper on 0

现在处于关机状态,start programreturn 1。这意味着要么它完成了 hanup,要么父进程终止了,主要问题是找出这两者中的哪一个刚刚发生。 X 错误也会导致 1。捕获 shellscript 不起作用。

如果您想查看实际代码,请访问 GitHub:
http://github.com/BonsaiDen/Atarashii


好的,我终于找到了解决方案:)

在这种情况下,你根本不能依赖信号。您必须连接到桌面会话才能收到即将注销的通知。

import gnome.ui

gnome.program_init('Program', self.version) # This is going to trigger a warning that program name has been set twice, you can ignore this, it seems to be a problem with a recent version of glib, the warning is all over the place out there
client = gnome.ui.master_client() # connect us to gnome session manager, we need to init the program before this
client.connect('save-yourself', self.on_logout) # This gets called when the user confirms the logout/shutdown
client.connect('shutdown-cancelled', self.on_logout_cancel) # This gets called when the logout/shutdown is canceled
client.connect('die', self.on_logout) # Don't know when this gets called it never got in my tests

def on_logout(self, *args):
    # save settings an create a file that tells the wrapper that we have exited correctly!
    # we'll still return with status code 1, but that's just gtk crashing somehow

def on_logout_cancel(self, *args):
    # simply delete the logout file if it exists

这里有一个重要的注意事项:不要尝试在on_logout,如果您这样做,GNOME 将无法识别您的程序已退出,并会显示某些程序仍在运行的对话框。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Python sqlite3参数化删除表

    我在 python 中删除 sqlite3 表时遇到问题 我正在使用标准sqlite3模块 self conn sqlite3 connect sql drop table self conn execute sql u table nam
  • 蜘蛛内的Scrapyd jobid值

    Scrapy 框架 Scrapyd 服务器 我在获取蜘蛛内部的 jobid 值时遇到一些问题 将数据发布到后http localhost 6800 schedule json http localhost 6800 schedule jso
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • Windows Defender 检测 Python EXE 为木马

    我制作了一个 Python 脚本 将 Windows 目录以 zip 形式邮寄给我 我使用 sched 模块添加了一个调度程序 每小时重复一次 我试图制作一个简单的同步应用程序供个人使用 在 Windows 启动时启动 我使用将其转换为 e
  • OpenCV - 我需要将彩色图像插入黑白图像并且

    我用以下代码将黑白图像插入彩色图像 没问题 face grey cv cvtColor face cv COLOR RGB2GRAY for row in range 0 face grey shape 0 for column in ra
  • python 脚本中 os.system 的 256 和 512 响应代码是什么

    当我在 python 中使用 os system ping 服务器时 我得到多个响应代码 使用的命令 os system ping q c 30 s SERVERANME 0 在线 256 离线 512 512 是什么意思 Per the
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何在Python中求和

    我想知道如何在 python 中表示总和而不需要像这样的循环here http docs scipy org doc scipy reference tutorial optimize html 我们有 def rosen x The Ro
  • Flask 中的 import 和 extends 有什么区别?

    我正在阅读 Flask Web 开发 在例4 3中 extends base html import bootstrap wtf html as wtf 我想知道 extends 和 import 有什么区别 我认为它们在用法上很相似 在什
  • 使用 python 只读取 Excel 中的可见行

    我想只读取 python 中 Excel 工作表中的可见行 输入 Excel表 所以当我过滤时 作为 python 中的输出 在本例中我将仅获得可见数据 1 行 这是我的代码 from openpyxl import load workbo
  • python:是否有用于对输入流进行分块的库函数?

    我想对输入流进行分块以进行批处理 给定一个输入列表或生成器 x in 1 2 3 4 5 6 我想要一个能够返回该输入块的函数 说 如果chunk size 4 then x chunked 1 2 3 4 5 6 这是我一遍又一遍地做的事
  • 如何绘制多类分类器的精度和召回率?

    我正在使用 scikit learn 我想绘制精度和召回曲线 我正在使用的分类器是RandomForestClassifier scikit learn 文档中的所有资源都使用二元分类 另外 我可以绘制多类的 ROC 曲线吗 另外 我只找到
  • 在python中安装scipy模块时出错

    我正在尝试使用 pip 在 python 中安装 scipy 模块 它显示以下错误 Command c users sony appdata local programs python python35 32 python exe u c
  • Linux 堆栈大小

    我正在寻找 Linux 内核中堆栈的良好描述 但我发现找到任何有用的东西出奇地困难 我知道大多数系统的堆栈限制为 4k 而其他系统则限制为 8k 我假设每个内核线程 下半部分都有自己的堆栈 我还听说 如果中断发生 它会使用当前线程的堆栈 但
  • 如何将 fields 参数传递到 Google Drive Python API 调用中

    I have results drive service files list body execute where body q query string maxResults 1 为了提高性能 我想限制返回的字段 如下所述 https
  • Pip 突然使用了错误版本的 Python

    在 os x 上使用 pip 时遇到一个奇怪的问题 据我所知 快速查看我的 bash history 似乎可以确认 我最近没有对我的配置进行任何更改 唉 pip 命令似乎突然使用了与以前不同的 python 版本 到目前为止 我使用命令 p
  • Flask 扩展未在 app.extensions 中注册

    我想访问在我的 Flask 应用程序上注册的一些扩展 我尝试使用app extensions 但我初始化的一些扩展不在字典中 from flask import current app current app extensions get
  • 在多个图表上绘制一条线

    I don t know how this thing is called or even how to describe it so the title may be a little bit misleading The first a
  • 在至少 7 天内连续三天登录该产品的用户

    我有一个用于用户参与的数据框 df 如下所示 time stamp user id 2013 01 01 10 05 23 1 2013 01 03 16 35 23 1 2013 01 06 11 06 35 1 2013 01 10 1
  • 通过 ManyToManyField = Value 对 django 查询集进行排序

    如果有一些模型 例如 class Tag models Model name models CharField class Thing models Model title models CharField tags models Many

随机推荐

  • 在不使用 UDF 和 CLR 的情况下,从 T-SQL 中的字符串中删除所有空白字符的好方法是什么?

    NET 函数string Trim 修剪相当广泛的空白字符集 如何以最佳方式 T SQL 模拟这种确切的行为 LTRIM and RTRIM仅修剪空格字符是不够的 这对于 SQL CLR 来说很容易 但这并不总是可行 而且调用成本也相当高
  • 之前的图像大小在 DOM 中

    在将图像放入 DOM 之前如何获取图像大小 var imgLoad img imgLoad attr src ImageGallery ImagesList index new Date getTime imgLoad unbind loa
  • 如何快速重新加载 ui 视图的内容

    我有一个视图控制器 其中有滚动视图 并且滚动视图有一个视图 因此 视图有很多按钮和标签 这些按钮和标签的显示取决于来自 api 的数据 按下后我有一个按钮 我想重新加载视图 它的内容 简单的黑客之一NOT推荐的方法是 self view s
  • TensorFlow 中使用稀疏标签进行多标签图像分类?

    我想对 n 个类别执行多标签图像分类任务 我为每个图像提供了稀疏标签向量 并且每个标签向量的每个维度当前都以这种方式编码 1 0 gt Label true Image属于这个类 1 0 gt Label false 图像不包含此类 0 0
  • 如何在 JavaScript 中返回值

    我有一个 JavaScript 函数 function myFunction value1 value2 value3 Do stuff and value2 somevalue2 to return value3 somevalue3 t
  • Ruby 企业版与 Ruby 1.9

    我计划建立一个简单的 CMS 网站 用户可以在其中提交和查看包含视频 照片和文本的帖子 我想要做出的一个决定是在 Ruby Enterprise Edition 和 Ruby 1 9 之间进行选择 我关心的事情按顺序 性能和可扩展性 与现有
  • 如何在JBOSS 5中启用远程调试?

    如何在 JBoss 5 中启用远程调试 JBoss 4 中的常用语句 set JAVA OPTS Xdebug Xnoagent Xrunjdwp transport dt socket address 8787 server y susp
  • 如何在后台线程中创建 WPF 控件?

    我有创建后台线程来执行某些操作的方法 在这个后台线程中我创建对象 但是这个对象在运行时创建时给了我一个例外 调用线程必须是 STA 因为许多 UI 组件都需要它 我知道我必须使用 Dispatcher 来向 UI 反映某些内容 但在本例中
  • 我如何以csv格式输出hadoop结果

    我需要以 csv 格式输出我的 hadoop 结果 我该怎么做 我的代码 https github com studhadoop xml blob master XmlParser11 java 我应该简单地在我的代码中包含 csvoutp
  • 即使程序中止,如何强制 gcov 提取数据

    我正在使用一个名为 KLEE 的测试生成工具 它为我的 C99 代码创建了大量测试 然后我运行测试并使用 gcov 检查线路覆盖率 Gcov 似乎会在成功完成运行结束时更新覆盖数据 但是 某些测试会失败 断言语句不正确 这会导致程序中止并且
  • 如何将 Lua 5.2 与 luasocket 3 一起使用

    我正在尝试编译luasocket 3我在 GitHub 上找到的lua 5 2 问题是 我不知道如何绑定在一起Lua with luasocket 我需要编译吗luasocket作为 DLL 然后引用lua代码 或者我应该从 lua 控制台
  • UINavigationBar 以按钮为标题。

    我做了一些挖掘 似乎没有得到任何有用的东西 我想做的是非常基本的 但我不确定它们是否是 1 更简单的方法 2 或者苹果是否会拒绝 我有一个通过 UINavigationController 控制的视图 显然从这篇文章的标题来看 并且其中有一
  • 为什么在将 ApplicationCookie 与 ASP.Net Identity 一起使用之前调用 SignOut(DefaultAuthenticationTypes.ExternalCookie)?

    为什么此示例在使用 ApplicationCookie 登录之前调用ExternalCookie 的SignOut 这只是确保身份验证信息干净的一种方法吗 完整的例子在这里 http www asp net identity overvie
  • Python utf-8,如何对齐打印输出

    我有一个包含日语字符以及 正常 字符的数组 如何对齐这些打印件 usr bin python coding utf 8 a1 trazan a2 dipsy laa laa banarne po tinky winky for i j in
  • 从大型数据集中删除重复项(>100Mio 行)

    我知道这个主题在此之前出现过很多次 但建议的解决方案都不适用于我的数据集 因为我的笔记本电脑由于内存问题或已满存储而停止计算 我的桌子如下所示108澪行 Col1 Col2 Col3 Col4 SICComb NameComb Case N
  • C 样式强制转换可以处理但 C++ 强制转换不能处理的转换

    据说C 风格的强制转换只是尝试应用 C 强制转换的不同组合 并使用第一个允许的组合 但是 我有一种感觉 听说有些情况只能处理 C 风格的强制转换 而不允许使用 C 强制转换的组合 我错了吗 是这样吗anyC型铸入式any上下文 在 C 中
  • 从报告中的两个表查询

    我的 VB 应用程序通过 ODBC 打印报告 我使用数据库专家添加了表格并设计了水晶报表 我的查询应该放在哪里 这是我的查询 SELECT ts SCHEDIDNO ts DAYNAME DATE FORMAT ts TIMESTART h
  • 如何从 boto 调用返回 XML?

    我在用博托2 32 1使用Python 2 7 6 我遇到了问题订单列表boto 的 mws 模块的功能是获取我的亚马逊订单的 XML 数据 这是我拨打的电话 response connection list orders CreatedA
  • 如何将月份名称映射到月份编号,反之亦然?

    我正在尝试创建一个函数 可以将月份数字转换为缩写的月份名称或将缩写的月份名称转换为月份数字 我认为这可能是一个常见问题 但我在网上找不到 我在想calendar模块 我发现要将月份数字转换为缩写月份名称 您可以这样做calendar mon
  • Linux下Python / GTK中检测用户注销/关闭 - SIGTERM/HUP未收到

    好吧 这可能是一个困难的问题 我有一个 pyGTK 应用程序 由于我无法捕获 控制的 X Window 错误而随机崩溃 因此 我创建了一个包装器 一旦检测到崩溃 它就会重新启动应用程序 现在问题来了 当用户注销或关闭系统时 应用程序会以状态