我有一个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
,看看发生了什么?启动验尸调试器会告诉我脚本正在做什么,或者在我杀死它之前它在哪一行?有没有办法接受这个?
答案 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()