退出/捕获系统异常并发出kerberos命令的python陷阱

时间:2013-04-02 02:04:22

标签: python unix scripting kerberos

我们目前正在我们的unix环境中迁移到SSH和Kerberos身份验证方案。我需要在脚本中断,出现错误或脚本成功执行的任何时候在我们所有的自动python脚本中发出Kerberos OS命令。我知道在bash中你可以在退出时陷阱,但从我的研究来看,python中没有这个功能。我的尝试是使用try / except / else块和工作,但不会捕获直接进程杀死并发出命令。我绝不是一个python专家,所以有谁知道一个更好的方法来解决这个或一个函数?此外,这只适用于调用main函数的简单脚本,我的一些脚本是面向对象的,而且更复杂,我的方法也无法工作。这是我尝试一个简单的循环。有什么建议吗?

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)

3 个答案:

答案 0 :(得分:1)

尝试使用此模块:

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

它定义了一种设置关闭挂钩的更方便的方法。

import atexit

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

干净,呵呵?

答案 1 :(得分: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,它将被异常处理程序捕获,并且您不会收到警告。

答案 2 :(得分: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()