2013-08-21 25 views
0

我有一個python腳本,工作和無限循環,該腳本做了幾件事情,並從類中使用了幾個方法,將信息記錄到我有和SQS一起工作的幾個記錄器亞馬遜排隊。事情是這樣的:殺python腳本並看到最後一行執行

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

可能提高一些例外? – gen

+0

@gen,我這樣做,但正如我所說,腳本不停止運行,我必須殺死它。 – PepperoniPizza

回答

3

strace會給你一個系統調用及其響應的看法。它可能比你喜歡的級別低,但它可以讓你看到網絡呼叫是否失敗,或讀取超時,或者發生了什麼。

在標準亞馬遜Linux映像strace的可與 '百勝安裝strace的'

要找到一個程序 「mycommand的」

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

謝謝我會試試這個。 – PepperoniPizza

+0

這實際上是有用的,它表明腳本正在運行,或者如果它停止在某處等待某種輸入,唯一的問題就是,正如你所說的,低級別,還有其他方法嗎? – PepperoniPizza

+0

有*略*更高級別的工具可用。至少ltrace從系統調用到C庫。一個稍微不同的方法是使用gdb附加到進程,但如果你不知道gdb,這將不是學習它的最好方法... –

1

最簡單的方法是將 標準錯誤重定向到文件

python script.py 2> my_error_file & 

Python會提供的信息,其行其正在執行 ,如果計劃失敗,您可以檢查文件

你將不得不殺死它kill -SIGINT <pid>雖然

+0

謝謝,但正如我所說的,程序不會失敗,它卡住某處,該過程必須手動殺死。 – PepperoniPizza

+0

並不重要,如果你殺了這個進程,python會拋出一個異常,並將stacktrace打印到stderr –

+0

我的一個小錯誤,編輯。 –