2017-10-07 5 views
0

コマンドpython script.py &を使用して、バックグラウンドでpythonスクリプトを実行しています。スクリプトは次のようになります。背景のPythonスクリプトをきれいに終了する

import time 

def loop(): 
    while True: 
     time.sleep(1) 

if __name__=='__main__': 
    try: 
     loop() 
    except KeyboardInterrupt: 
     print("Terminated properly") 

それはスクリプトを終了することになると、私は、それが(例えば、「適切に終端」印刷など)が停止される前に、いくつかのクリーンアップを行いたいと思います。現在のプロセスとして実行すると、これはキーボード割り込み後にexceptステートメントで処理されます。

kill PIDコマンドを使用すると、クリーンアップは実行されません。バックグラウンドプロセスを停止し、終了する前にいくつかのコード行を実行するにはどうすればよいですか?

+1

'kill -s 2 PID'を使用して、PID割り込みを処理するキーボード割り込みを送信できます。もし私の記憶に間違いがなければ、それは信号「2」でなければなりません。 – Sraw

+1

'kill'は' KeyboardInterrupt'とは異なるシグナルを送ります。デフォルトでは、 'INT(2)'を送信します。詳しくはhttp://linuxcommand.org/lc3_man_pages/kill1.html – Vinny

+1

@Vinny signal 9はSIGKILLです... – NieDzejkob

答えて

0

あなたはキル経由でスクリプトに送信された信号をキャッチする信号モジュールを使用することができます。 クリーンアップを実行する問題の信号を捕捉するようにシグナルハンドラを設定しました。

import signal 
import time 

running = 0 

def loop(): 
    global running 
    running = 1 
    while running: 
     try: time.sleep(0.25) 
     except KeyboardInterrupt: break 
    print "Ended nicely!" 

def cleanup (signumber, stackframe): 
    global running 
    running = 0 

signal.signal(signal.SIGABRT, cleanup) 
signal.signal(signal.SIGTERM, cleanup) 
signal.signal(signal.SIGQUIT, cleanup) 
loop() 
0

使用finally句:

def loop(): 
    while True: 
     time.sleep(1) 

if __name__=='__main__': 
    try: 
     loop() 
    except KeyboardInterrupt: 
     print("Terminated properly") 
    finally: 
     print('executes always') 
+0

'kill'コマンドを使用しているときに' finally'節が実行されていないようです。 – henneray

+0

このQ/Aを確認してください[Pythonで殺される前に最後の関数を実行するには?](https://stackoverflow.com/questions/930519/how-to-run-one-last-function-beforegetting- Pythonで殺された)。 – temasso

関連する問題