Popen.terminate(), kill() și send_signal() în Python

Procese (subprocess) Python 3.0+

Opresc un proces pornit cu Popen sau îi trimit un semnal.

Sintaxă
p.terminate()
p.kill()
p.send_signal(semnal)

Ce face Popen.terminate(), kill() și send_signal()

terminate() cere oprirea (pe Unix trimite SIGTERM, pe care programul îl poate trata pentru o închidere curată). kill() oprește forțat (SIGKILL pe Unix). Pe Windows, ambele apelează TerminateProcess. send_signal(s) trimite orice semnal, de exemplu SIGINT (ca Ctrl+C).

După oprire, apelează wait() ca să eliberezi procesul. Pe Unix, returncode este minus numărul semnalului.

Parametri

Parametru Descriere
semnal Pentru send_signal: constanta din signal.

Ce returnează

None.

Exemple

Exemplul 1: Oprire politicoasă, apoi forțată

import subprocess, signal, sys
cod = "import time\nwhile True: time.sleep(1)"
for metoda in ["terminate", "kill", "send_signal"]:
    p = subprocess.Popen([sys.executable, "-c", cod])
    if metoda == "send_signal":
        p.send_signal(signal.SIGINT)
    else:
        getattr(p, metoda)()
    try:
        p.wait(timeout=5)
    except subprocess.TimeoutExpired:
        p.kill()
        p.wait()
    print(metoda, p.returncode)

Rezultat (pe Linux sau macOS)

terminate -15
kill -9
send_signal 1

Greșeli frecvente

  • Trimiți SIGINT unui program Python și te miri că se termină cu codul 1 și un mesaj KeyboardInterrupt în stderr: Python transformă semnalul în excepție.

Comenzi înrudite