gpt4 book ai didi

python - 在 Python 中 session 终止时获取信号

转载 作者:太空宇宙 更新时间:2023-11-04 12:36:29 24 4
gpt4 key购买 nike

我正在尝试编写一个 Python 恶魔,它对 session 结束使用react(即 TTY 已关闭,因为 bash 已退出,等等)。据我了解,应该在某个时候将 SIGHUP 发送到流程(我不清楚具体细节),但到目前为止我还没有捕捉到任何东西。

这是我的非功能性 python 尝试:

#!/usr/bin/env python
import os
import sys
import signal
import time

def log_to_disk(signum, frame):
with open("/tmp/SIGNAL", "w") as f:
f.write("Received %d!\n" % signum)

def fork():
try:
pid = os.fork()
if pid > 0:
# Exit parent
print "Parent exiting. Bye!"
sys.exit(0)
except OSError as e:
print "Error while forking! (%s)" % str(e)
sys.exit(1)

fork()
os.chdir('/')
os.setsid()
os.umask(0)
fork() # Second fork.

# Catch ALL the signals just in case.
for i in [x for x in dir(signal) if x.startswith("SIG")]:
try:
signum = getattr(signal, i)
signal.signal(signum, log_to_disk)
except Exception as e:
print "Couldn't handle %s (%s)." % (i, str(e))
while True:
time.sleep(10)

我在做什么:我通过 SSH 连接到服务器,在那里启动脚本,然后关闭我的 SSH session 。然后我重新登录,希望 /tmp/SIGNAL 文件已经创建,但到目前为止还没有成功。如果我使用 kill 向进程发送信号,文件就会出现,所以我假设这不是处理程序的问题。我也试过只 fork 一次和/或注释掉 chdir/setsid/umask 部分,但我也没有收到任何东西。我探索过的另一种途径是只 fork 一次并尝试定期写入 TTY,期望在它关闭时的某个时刻收到 SIGTTOU。

谁能帮帮我?

最佳答案

我已经找到了一个解决方法,即检测何时 stdout 无法再解析为 TTY 名称:

import os
import sys
import time

def fork():
try:
pid = os.fork()
if pid > 0:
# Exit parent
print "Parent exiting. Bye!"
sys.exit(0)
except OSError as e:
print "Error while forking! (%s)" % e.message
sys.exit(1)

fork()
os.chdir('/')
os.setsid()
os.umask(0)
fork() # Second fork.

while True:
time.sleep(1)
with open("/tmp/SIGNAL", "a+") as f:
try:
os.ttyname(1) # 1 = stdout
except:
f.write("The session has been shut down :)\n")
sys.exit(0)

我仍然不确定到底发生了什么:当我在 ps 中查看 Python 进程时,TTY 列显示一个问号(?),所以我看不出如何它仍然可以在双叉之后解析其标准输出。我还会将这个问题开放一段时间,以防有人想出一个在没有 TTY 的 shell 中有效的答案!

关于python - 在 Python 中 session 终止时获取信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com