GNU/Linux >> Znalost Linux >  >> Linux

Jak ukončit proces z Pythonu pomocí pid?

Chtěl jsem udělat to samé jako, ale chtěl jsem to udělat v jednom souboru.

Takže logika by byla:

  • pokud je spuštěn skript s mým jménem, ​​ukončete jej a ukončete
  • pokud skript s mým jménem neběží, udělejte to

Upravil jsem odpověď od Bakuriu a přišel s tímto:

from os import getpid
from sys import argv, exit
import psutil  ## pip install psutil

myname = argv[0]
mypid = getpid()
for process in psutil.process_iter():
    if process.pid != mypid:
        for path in process.cmdline():
            if myname in path:
                print "process found"
                process.terminate()
                exit()

## your program starts here...

Spuštění skriptu udělá vše, co skript udělá. Spuštění další instance skriptu ukončí všechny existující instance skriptu.

Používám to k zobrazení malého widgetu kalendáře PyGTK, který se spustí, když kliknu na hodiny. Pokud kliknu a kalendář není spuštěn, zobrazí se kalendář. Pokud kalendář běží a kliknu na hodiny, kalendář zmizí.


Pomocí úžasného psutil knihovna je docela jednoduchá:

p = psutil.Process(pid)
p.terminate()  #or p.kill()

Pokud nechcete instalovat novou knihovnu, můžete použít os modul:

import os
import signal

os.kill(pid, signal.SIGTERM) #or signal.SIGKILL 

Viz také os.kill dokumentaci.

Pokud máte zájem spustit příkaz python StripCore.py pokud neběží a jinak jej zabíjíte, můžete použít psutil abychom to dělali spolehlivě.

Něco jako:

import psutil
from subprocess import Popen

for process in psutil.process_iter():
    if process.cmdline() == ['python', 'StripCore.py']:
        print('Process found. Terminating it.')
        process.terminate()
        break
else:
    print('Process not found: starting it.')
    Popen(['python', 'StripCore.py'])

Ukázkový běh:

$python test_strip.py   #test_strip.py contains the code above
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.
$killall python
$python test_strip.py 
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.

Poznámka :V předchozím psutil verze cmdline byl atribut místo metody.


Linux
  1. Jak stahovat soubory ze serveru SFTP pomocí skriptu python

  2. Jak zabít proces v Linuxu pomocí příkazu?

  3. Jak zkontrolovat, zda proces stále běží pomocí Pythonu na Linuxu?

  1. Jak vypočítat využití CPU procesu pomocí PID v Linuxu z C?

  2. Jak získat PID z rozvětveného podřízeného procesu ve skriptu shellu

  3. Jak zabránit procesu v zápisu souborů

  1. Jak identifikovat proces, který nemá PID?

  2. Jak aktualizovat Python z 3.4.3 na 3.5?

  3. Jak trasovat Python skripty pomocí trace.py