1

我有一个可以在无限循环中工作的 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并查看发生了什么?启动事后调试器会告诉我脚本在做什么,或者在我杀死它之前它在哪一行?有什么办法可以解决这个问题吗?

4

3 回答 3

5

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

在标准 amazon linux 映像上,strace 可通过“yum install strace”获得

查找程序“mycommand”

# find the pid
ps -ef | grep [m]ycommand
# use the pid from the previous command
strace -p $thepid
于 2013-08-21T19:41:46.387 回答
1

最简单的方法是将标准错误重定向到文件

python script.py 2> my_error_file &

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

kill -SIGINT <pid>不过,您将不得不杀死它

于 2013-08-21T19:27:48.567 回答
0

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

except KeyboardInterrupt:
  print("...")
  traceback.print_exc()
于 2020-08-06T03:39:13.017 回答