2017-10-07 3 views
0

Ich verwende ein Python-Skript im Hintergrund mit dem Befehl python script.py &. Das Skript könnte so aussehen.Beenden Hintergrund Python-Skript schön

import time 

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

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

Wenn es um die Einstellung des Skript kommt, würde Ich mag einige Bereinigungs tun, bevor es (wie Drucken „Abgebrochen richtig“) gestoppt wird. Wenn ich als aktueller Prozess laufe, würde dies nach einem Tastatur-Interrupt von der except-Anweisung behandelt werden.

Mit dem Befehl kill PID wird die Bereinigung nie ausgeführt. Wie kann ich einen Hintergrundprozess stoppen und einige Codezeilen ausführen, bevor er beendet wird?

+1

können Sie 'kill -s 2 PID' verwenden, um einen Tastatur-Interrupt zur Verarbeitung von' PID' zu senden. Ähm ... es sollte Signal "2" sein, wenn es keinen Fehler mit meiner Erinnerung gibt. – Sraw

+1

'kill' sendet ein anderes Signal als' KeyboardInterrupt'. Standardmäßig sendet es 'INT (2)' Sie können mehr darüber hier lesen http://linuxcommand.org/lc3_man_pages/kill1.html – Vinny

+1

@Vinny Signal 9 ist SIGKILL ... – NieDzejkob

Antwort

0

Sie Signalmodul keine Signale an das Skript geschickt fangen über töten können. Sie haben einen Signalhandler eingerichtet, um das fragliche Signal abzufangen, das die Bereinigung durchführen würde.

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

Verwenden finally Klausel:

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

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

Die 'finally'-Klausel scheint nicht ausgeführt zu werden, wenn der Befehl' kill PID' verwendet wird. – henneray

+0

Bitte überprüfen Sie diese Frage [Wie führe ich eine letzte Funktion aus, bevor ich in Python getötet werde?] (Https://stackoverflow.com/questions/930519/how-to-run-one-last-function-before-getting- getötet-in-Python). – temasso