杀死python脚本并查看最后一行执行

时间:2013-08-21 19:18:33

标签: python debugging process stack-trace

我有一个python脚本,可以在无限循环中运行,脚本可以执行多项操作,并使用类中的几种方法,将信息记录到我拥有的几个记录器中,并与SQS Amazon队列一起使用。像这样:

A = ClassA()
B = ClassB()
C = ClassC()

while True:
    # pull messages from SQS
    messages = sqs.pull_messages()
    logger.info('Pulled messages from SQS')
    A.do_something(messages)
    logger.info('Doing something on class A')
    # download something from the internet
    data = B.download_something()
    logger.info('Downloaded something')
    C.insert_to_database()

该脚本可以正常运行好几天而不会耗尽内存或退出脚本因为回溯,我在Linux框中启动了这样的脚本:

python script.py &

几天之后我可以回到方框并发现脚本仍在运行,但记录器记录的数据直到1天前,这不是常见的模式,有时脚本会在数小时后停止工作,有时会在几天后停止工作,但永远不会得到杀死。

所以我的问题是,是否有一种方法可以杀死进程kill pid,看看发生了什么?启动验尸调试器会告诉我脚本正在做什么,或者在我杀死它之前它在哪一行?有没有办法接受这个?

3 个答案:

答案 0 :(得分:5)

strace将为您提供系统调用及其响应的视图。它可能比您喜欢的级别低,但它可以让您查看网络呼叫是否失败,读取超时,或者可能发生的任何事情。

在标准的亚马逊linux图像strace上可以使用'yum install strace'

查找程序“mycommand”

# find the pid
ps -ef | grep [m]ycommand
# use the pid from the previous command
strace -p $thepid

答案 1 :(得分:1)

最简单的方法是 将stderr重定向到文件

python script.py 2> my_error_file &

Python将提供它正在执行的行的信息 如果程序失败,您可以检查文件

你必须用kill -SIGINT <pid>

来杀死它

答案 2 :(得分:0)

如果您手动终止该进程,则应该打印出某些内容,但是如果没有,您可以指定使用“ ctrl + c”停止该进程时要打印的内容

except KeyboardInterrupt:
  print("...")
  traceback.print_exc()