2013-04-02 44 views
0

我們目前正在遷移到我們的unix環境中的SSH和Kerberos身份驗證方案。我需要在腳本被中斷,出現錯誤或腳本成功執行的任何時候,在我們所有的自動化Python腳本中發出Kerberos操作系統命令。我知道在bash中你可以陷入退出,但從我的研究,python中沒有這些功能。我嘗試使用try/except/else塊和工作,但不會捕獲直接進程kill併發出命令。我絕不是一個Python專家,所以有人知道一個更好的方法來看看這個函數嗎?而且,這隻適用於調用主函數的簡單腳本,我的一些腳本是面向對象的,而且更復雜,我的方法無法工作。這是我的一個簡單的循環嘗試。有什麼建議?退出時的python陷阱/捕獲系統異常併發出kerberos命令

def main(): 
    while (True): 
     print "Interrupt Me..." 

def watchForInterrupts(x): 
    #define function to issue kdestroy command 
    def issueKdestroy(): 
     import os 
     os.system("kdestroy -q") 
     print "issued kdestroy" 
    try: 
     x() 
    except: 
     print "interrupted, issuing kdestroy" 
     #call issueKdestroy function if interrupted 
     issueKdestroy() 
    #else block to issue kdestroy if script completed successfully 
    else: 
     print "executed successfully, issuing cleanup kdestroy" 
     issueKdestroy() 

#call watchForInterrupts function with main passed as a parameter 
watchForInterrupts(main) 
+0

尋找'finally'關鍵字。它的工作原理類似於java :) –

回答

0

基於另一個答案,使用try ... finally並添加一個信號處理程序,以確保最終在發出SIGQUIT時被調用。

import signal 
import os 
import sys 

def callKdestroy(): 
    print "call kdestroy" 

def signal_handler(signum, frame): 
    # ensures unwinding of Python execution. 
    print "got signal" 
    sys.exit(1) 

signal.signal(signal.SIGTERM, signal_handler) 

try: 
    ... 
finally: 
    callKdestroy() 
0

我建議使用finally

def watchForInterrupts(x): 
    ... 
    try: 
     x() 
    finally: 
     # Clean up no matter what happens in try part of block 
     issueKdestroy() 

可以採取各種異常的具體行動,如果你想

def watchForInterrupts(x): 
    ... 
    try: 
     x() 
    except KeyboardInterrupt: 
     print "User requested termination, cleaning up" 
    except SystemExit: 
     # You may want to re-raise this 
     print "Program terminated abnormally" 
    else: 
     print "Executed sucessfully" 
    finally: 
     # Clean up no matter what happens in try part of block 
     issueKdestroy() 

你也應該避免except沒有指定一個例外。例如,如果在被調用的函數中有一個SyntaxError被異常處理程序捕獲,並且不會收到警報。

+0

我知道終於和最初使用它,但讓我們說,如果我在執行過程中發出cntl^c鍵盤中斷,它將捕獲異常,發出kdestroy,然後命中finally塊並再次發佈。我的意思是它不會傷害兩次,但它的馬虎。與其他,或者由於錯誤引發異常,或者其被認爲是成功的,併發出其他清理kdestroy ...也沒有解決進程kill選項。如果我在任一選項中執行期間執行kill 命令,則不會發出kdestroy。任何其他意見或想法? –

+0

不要在那時調用issueKdestroy嗎? – root

+0

@VinnieBiros請注意,'issueHdestroy'只在'finally'塊中,不存在,所以它只會被調用一次。因爲我不知道PID殺死要求,所以我沒有在例子中處理。在這種情況下,我建議亞歷克斯對我的回答......無論它如何退出,它總是會按照你的意願去做。 – SethMMorton

1

嘗試使用此模塊:

http://docs.python.org/2/library/atexit.html

它定義設定關閉掛鉤的一個更方便的方法。

import atexit 

@atexit.register 
def goodbye(): 
    print "You are now leaving the Python sector." 

整潔,是吧?

+0

如果您使用默認信號處理程序,則不會調用atexit回調。 – root