2017-11-24 18 views
0

私は、ポート5002でUDP通信を開始するPythonコードを持っています。これは、Pythonスクリプトが実行されている可能性があるためPythonスクリプトを停止する前にコマンドを実行する方法

sock.bind(address) 
OSError: [Errno 98] Address already in use 

:私は最初のコードを実行したときにだから何が起こるか、それはその後、正常に動作し、私はctlr z/ctrl cを使用してPythonスクリプトを閉じてから、再度、それはエラーの下に私を示してコードを実行し、ありますポートをビジーに保ちます。だから私には上記のエラーが表示されます。これを解決するには、ソケットを閉じるコードがsock.close()を殺し、sys.exit()をPythonスクリプトを正しく終了する前に、これらの2つのコマンドを実行することを考えました。そのため、コードが強制終了される直前にこれらのコマンドを実行する方法を知る必要があります。私はKeyboardInterrupt例外を使用することはできません。これは将来、これがサービスとして実行されるためです。

私はこれを見つけましたが、それを実装することはできません。answer例えば、私がしなければ:

import atexit 
import time 

def exit_handler(): 
    print("STOPPED") 

while True: 
    print("Running....") 
    time.sleep(1) 
    atexit.register(exit_handler) 

これが実行されている続けているが、私は、コードを殺すときにStoppedを印刷しません。どのようにそれを実装するか、私の状況を処理するための代替方法があります。

おかげ

atexitモジュールのドキュメントは重要な注意点があります
+1

https://stackoverflow.com/a/1112350/5270506 –

+0

https://stackoverflow.com/questions/4205317/capture-keyboardinterrupt:

だから、代わりにSIGTERMとSIGINTのためのハンドラを登録する必要があります-in-python-without-try-except –

+0

@ Farhan.KIキーボード割り込みでコードを強制終了したくありません。このコードを開始または停止するサービスがあります。だからキーボードの割り込みを使用することはできません –

答えて

1

:あなたは特別な処理なしにスクリプトを殺した場合、登録した関数が呼び出されないことを意味

Note: The functions registered via this module are not called when the program is killed by a signal not handled by Python

signal.signal(SIGTERM, (lambda signum, frame: exit_handler())) 
signal.signal(SIGINT, (lambda signum, frame: exit_handler())) 
関連する問題