2

jython 2.7 jsr223 スクリプト エンジンを使用しています。そして、jython 実行の終了時にクリーンアップするのが好きです。

終了: jython スクリプト エンジンを実行するスレッドを中断します。

クリーンアップ:シグナルハンドラの登録: signal.signal(signal.SIGTERM, cleanup)

jython コードでは、スリープの例として、KeyboardInterruot 例外のスローに反応することがわかります。以下のコード:

public static void sleep(double secs) {
if (secs == 0) {
    // Conform to undocumented, or at least very underdocumented, but quite
    // reasonable behavior in CPython. See Alex Martelli's answer,
    // https://stackoverflow.com/a/790246/423006
    java.lang.Thread.yield();
} else {
    try {
        java.lang.Thread.sleep((long)(secs * 1000));
    }
    catch (java.lang.InterruptedException e) {
        throw new PyException(Py.KeyboardInterrupt, "interrupted sleep");
        }
    }
}

上記のコードは、新しい例外 PyException(Py.KeyboardInterrupt, "interrupted sleep") を発生させます。

理論的には、KeyboardInterrupt 例外をキャッチして、シグナル ハンドラを実行することができます。それにもかかわらず、KeyboardInterrupt はすべてのコマンドで一貫してスローされるわけではありません。jython の subprocess.check_call コマンドは、jython の実行が中断されたときに KeyboardInterrupt 例外をスローしたり、SIGINT または SIGTERM を起動したりしないように実装されています。そのため、現在実行中の python-java に相当するもの (jython コマンド) の実装では、kill 動作が変わる可能性があります。

同様の問題を抱えている人々は、jython コンソールを変更すると SIGINT がトリガーされるようになると言っています。: Jython でキーボード割り込み (CTRL-C) をインターセプトするにはどうすればよいですか?

そこで、python.console=org.python.core.PlainConsole を設定しました。Jython コードは次のように述べています。

ただし、これは、PythonInterpreter を埋め込んだり、Jython を JSR-223 スクリプト エンジンとして使用したりするアプリケーションのコンソールにも影響することに注意してください。

したがって、jsr223 を介したスクリプト エンジンの実行に影響するはずです。ただし、JVM で設定されたプロパティとして python.console=org.python.core.PlainConsole を使用しても、SIGINT スクリプト ハンドラーはトリガーされません。

そのため、サブプロセスを実行して中断されたときにjythonを実行すると、クリーンアップする方法がないようです。

それにもかかわらず、ノードを実行するjvmを中断すると、jython実行のシグナルハンドラが実行されることがわかりました。このスレッドは、JVM の終了が SIGTERM または SIGINT シグナルを転送しないことを示しています。ただし、シャットダウン フックを実行します。JVM が終了するとどうなりますか?

シャットダウン フックをデバッグしても、jvm 終了時の実行が明らかになりませんでした。

では、SIGINT および SIGTERM ハンドラがそのように実行される方法と理由は何ですか?

以下は、シグナル ハンドラーと jython を使用した KeyboardInterrupt 例外をテストするためのコードです。

import subprocess
import sys
import signal
import time

print 'Start'

def cleanup(signum, frame):
    outputFile = open('output.log','w')
    print "Starting cleanup"
    outputFile.write("Start cleanup")
    time.sleep(5)
    outputFile.write("Finished cleanup")
    outputFile.close()
    print "Done"
    sys.exit(0)

signal.signal(signal.SIGTERM, cleanup)
signal.signal(signal.SIGINT, cleanup)

try: outputFile = open('output.log','w')
    outputFile.write("Start sleeping bash subprocess:")
    outputFile.close()
    subprocess.check_call("sleep 10h", shell=True)
except KeyboardInterrupt as interrupt: outputFile = open('output.log','w')
    outputFile.write("Keyboard INterrupt caught")
    outputFile.close()

jsr223 jython スクリプト エンジン スレッドが中断された (実行が終了した) ときに、python/jython SIGTERM および SIGINT シグナル ハンドラを実行するにはどうすればよいですか???

手伝ってくれてどうもありがとう!

4

0 に答える 0