当我运行 python 程序(2.7 或 3)时,我导入一个模块,该模块具有初始化一些线程的类。问题是,每当主线程中发生未捕获的异常时,主函数就会死亡,但线程仍然像僵尸一样运行,导致 python 进程永远不会死亡。
在主线程(甚至其他线程)中存在任何未捕获的异常以杀死所有地方的所有内容的最佳方法是什么。
由于我经常调用该subprocess模块,所以我通常使用它threading.Event来帮助干净地退出。但是,未捕获的异常不会触发这些事件。
这是一个线程不会死的程序示例......
程序1.py
#!/usr/bin/env python2.7
import threading
import modx1
mod_obj = modx1.Moddy()
raise Exception('DIE UNEXPECTEDLY')
try:
raise Exception('known problem here')
except Exception:
mod_obj.kill_event.set()
Run Code Online (Sandbox Code Playgroud)
modx1.py
#!/usr/bin/env python2.7
import threading
import subprocess
from time import sleep
class Moddy():
def __init__(self):
self.kill_event = threading.Event()
self.my_thread=threading.Thread(target=self.thread_func)
self.my_thread.start()
def thread_func(self):
while not self.kill_event.is_set():
print('thread still going....')
sleep(2)
Run Code Online (Sandbox Code Playgroud) 编辑:与这个问题作斗争之后,似乎实际上是许多不同的问题都在有关Rsyslog的一些一般性问题下陷入了困境。因此,对问题的更好的“ TL; DR”摘要:“将Rsyslog与TLS一起使用会产生许多模糊/混淆的问题。如何使它起作用?” 我的答案摘要如下。
原始帖子:
我一直在努力将rsyslogTLS从客户端输出到服务器,特别是在使用“指纹”或“ certvalid”模式时。
我有多台计算机,其中一台是用于通过端口11514上的TCP / TLS接收syslog数据的服务器。其余的计算机是发送TCP / TLS的客户端。所有证书都具有使用相同证书颁发机构签名的证书(证书的密钥存储在其他位置)。这些计算机未直接连接到公用IP地址,并且没有DNS条目。
根据适用于哪个平台的版本(从7.6到8.4),即使尝试在所有机器之间共享相似的配置,不同的机器也会表现出不同的行为。gtls事实证明,该模块带来了不断变化的麻烦,因为每台机器都会以奇怪的,不同的方式出错。根据配置行的顺序,或者我使用的是Rainer脚本样式还是传统的样式,或者是否在证书的CN中使用了机器的主机名,等等,等等,它可能会出错。
尽管没有很好地记录每种模式的确切细节(在查看了像这样的稀疏解释之后:http : //www.rsyslog.com/doc/ns_gtls.html),但我选择不使用“ x509 / name” ”,因为它似乎对我没有任何作用。除非我没有弄错,否则“ x509 / name”与服务器上安装的机器证书的CN匹配PermittedPeers。但是,与所有示例相反,我的机器没有DNS条目,因此证书的CN完全是任意的。(但是,对于最后一台计算机的配置,gtls继续失败,直到我让CN匹配我的主机名为止。巧合还是发生了什么……?)
我只希望对每台计算机上的签名证书进行相互验证(因为它们是相同的签名证书,以及我使用“ x509 / certvalid”的原因)。如果可以,我也不反对通过证书指纹进行验证(或者找到有关如何使用的文档)。
在我的最后一台计算机上,我收到一条错误消息,说远程主机的名称(rsyslog服务器)与允许的对等主机不匹配。为什么它甚至需要,对“X509 / certvalid”,我不知道。然后,我尝试将服务器证书的指纹添加到允许的对等方(以我对预期格式的最佳猜测,带或不带冒号“:”或“ SHA1:”)。所有人都以同样的方式失败了,我不知道为什么。
可能值得注意的是,在我必须更换所有机器上的所有证书(使用我一直使用的相同方法:http ://www.rsyslog.com/doc/tls_cert_machine)之前,在此机器上进行的此设置实际上已经起作用。 html)。然后发生了一系列荒谬的故障:无法加载gtls,无法使用带有新样式的Legacy选项action(type="omfwd"...),等等,等等,并带有service rsyslog restart,systemctl restart rsyslog并且kill -HUP $(pidof rsyslog)都将其挂起或保留为不同的状态。经过最终的配置优化和完整的机器重启(嘘,不确定这是系统问题还是其他问题...),我被允许从此客户端生成对等错误...
客户端计算机的rsyslog版本:
rsyslogd 8.4.2, compiled with:
FEATURE_REGEXP: Yes
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG …Run Code Online (Sandbox Code Playgroud)