0

我们目前正在我们的 unix 环境中迁移到 SSH 和 Kerberos 身份验证方案。每当脚本中断、出现错误或脚本成功执行时,我都需要在我们所有的自动化 python 脚本中发出 Kerberos OS 命令。我知道在 bash 中您可以在退出时陷入陷阱,但根据我的研究,python 中没有该功能。我的尝试是使用 try/except/else 块并且可以工作,但不会捕获直接进程终止并发出命令。我绝不是 python 专家,所以有人知道更好的方法或要研究的函数吗?此外,这只适用于调用主函数的简单脚本,我的一些脚本是面向对象的并且更复杂,我的方法不起作用。这是我对一个简单循环的尝试。有什么建议吗?

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)
4

3 回答 3

1

尝试使用此模块:

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

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

import atexit

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

整齐吧?

于 2013-04-02T04:15:32.887 回答
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,它会被异常处理程序捕获,并且您不会收到此警报。

于 2013-04-02T02:44:00.620 回答
0

在另一个答案的基础上,使用 try...finally 并添加一个信号处理程序以确保在发出 SIGQUIT 时调用 finally。

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()
于 2013-04-02T04:13:07.867 回答