Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 进入pdb并发出终止信号_Python_Ipc_Pdb_Nohup_Interprocess - Fatal编程技术网

Python 进入pdb并发出终止信号

Python 进入pdb并发出终止信号,python,ipc,pdb,nohup,interprocess,Python,Ipc,Pdb,Nohup,Interprocess,在最近的一个项目中,我想在生产使用状态下调试我的程序。生产环境非常复杂,因此每当我发现问题时,我都想调试程序 这就是我想要实现的:每当我想要调试时,我都会向程序发送一个kill信号,希望pdb调试器会出现。是这样的: import pdb import signal import time def handler(signal, frame): pdb.set_trace() signal.signal(signal.SIGTERM, handler) a=1 while True:

在最近的一个项目中,我想在生产使用状态下调试我的程序。生产环境非常复杂,因此每当我发现问题时,我都想调试程序

这就是我想要实现的:每当我想要调试时,我都会向程序发送一个kill信号,希望pdb调试器会出现。是这样的:

import pdb
import signal
import time

def handler(signal, frame):
  pdb.set_trace()

signal.signal(signal.SIGTERM, handler)
a=1
while True:
  a+=1
  time.sleep(1)
但是,由于我必须使用
nohup
运行程序,所有输出都将重定向到nohup.out,因此我无法与pdb交互


有类似的操作吗?

如果从终端运行程序,可以使用
tty
命令记录 tty设备,并将其传递给环境中的程序:

TTY=`tty` nohup ./myprog.py
然后在处理程序中再次打开tty并将stdin和stdout设置为文件:

import sys,os

def handler(signal, frame):
  tty = os.getenv('TTY')
  sys.stdin = sys.stdout = open(tty,"r+")
  pdb.set_trace()

如果您正在从当前tty中分离程序(如注释中所示),则 可以尝试类似的方法,使用相同的python代码。这一次,请使用以下工具运行您的程序:

TTY=/tmp/link  nohup ./myprog.py &
然后关闭终端。打开一个新终端并创建指向此新tty的缺失链接:

ln -s `tty` /tmp/link
然后,在一行中给出kill命令以向python进程发送信号,然后 然后立即执行
睡眠
。这样,壳牌就不再与中国竞争了 用于从tty输入的pdb。例如,在一行:

kill -term $pid; sleep 99999
然后,您将让pdb连接到/tmp/link,这是您的tty。退出pdb时,键入ctrl-c 会停止睡眠

如果您需要在pdb中使用ctrl-c,并且您正在使用bash, 将
sleep 99999
替换为
suspend
。退出pdb时,使用终端菜单发送信号sigcont
返回挂起的bash的过程。

一种完全不同的方法,在我看来更简单、更优雅,就是使用。我已经在我的复杂系统中使用这种方法很长时间了,它使实时调试变得非常容易

基本上,您需要做的是定义一个简单的rpycapi服务,其中包含“公开”方法,用于将引用(“netref”)返回到系统中最感兴趣的对象。然后,在启动时,在流程中启动一个rpyc

然后,只要您愿意,就可以创建一个rpyc客户机,并连接到流程,通过API检索对对象的引用,并检查它们(透明地,就像那些netref是本地对象一样)。使用正确的API方法,您几乎可以在实时流程中访问任何您想要的内容


这种方法的其他优点是:(1)这种交互式会话甚至不必影响正在运行的进程(当然,除非您调用会产生副作用的方法等),(2)它不必是交互式的,也就是说,你可以很容易地编写一个连接到进程并从中打印一些信息的脚本。

我必须使用
nohup-python-myprog.py&
来运行程序。当我终止进程时,它似乎没有正确地进入pdb:
wangc@lion:~/workspace/temp>kill 2684wangc@lion:~/workspace/temp>--Return-->/home/wangc/workspace/temp/wwtest.py(10)handler()->None->pdb.set_trace()
您有两个进程在争夺终端。在本例中,不能使用“&”作为python的背景。从另一个终端执行kill。哦,我必须关闭原始终端,因为我使用的是来自windows的ssh。我不能让ssh程序永远打开。我添加了一个关闭原始终端的解决方案。您打开终端运行shell,然后我们告诉另一个进程pdb也使用终端。它们都将从tty中读取,并且随机选择哪个将获得您键入的字符。因此,我们需要让shell停止读取,这样只有pdb的读取才会成功。睡眠是一种简单的方法,因为睡眠不做任何阅读或写作。