2013-04-02 41 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