Protože jste řekl, že se jedná o linuxový server, voláte externí ps binární je obvykle pomalejší, využívá více zdrojů a je náchylnější k chybám než použití informací z /proc přímo.
Protože nikdo jiný nezmínil, jeden jednoduchý způsob je:
glob.glob('/proc/[0-9]*/')
Hodně štěstí.
Ke spuštění/zastavení dílčích procesů pythonu můžete použít modul podprocesů. Chcete-li zkontrolovat, zda běží, můžete použít psutil:
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
...nebo toto (také zkontroluje, zda bylo PID znovu použito):
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
To je to, co používám. Používá procfs (takže jste omezeni na systémy podobné Unixu, myslím, že nebude fungovat na počítačích Mac) a dříve zmíněný glob. Získá také cmdline, který vám umožní identifikovat proces. Pro ukončení procesu můžete použít os.kill(signal.SIGTERM, pid)
. Chcete-li použít podproces, zkontrolujte tento příspěvek Python, Popen a vyberte - čekání na ukončení procesu nebo vypršení časového limitu
def list_processes():
"""
This function will return an iterator with the process pid/cmdline tuple
:return: pid, cmdline tuple via iterator
:rtype: iterator
>>> for procs in list_processes():
>>> print procs
('5593', '/usr/lib/mozilla/kmozillahelper')
('6353', 'pickup -l -t fifo -u')
('6640', 'kdeinit4: konsole [kdeinit]')
('6643', '/bin/bash')
('7451', '/usr/bin/python /usr/bin/ipython')
"""
for pid_path in glob.glob('/proc/[0-9]*/'):
# cmdline represents the command whith which the process was started
f = open("%s/cmdline" % pid_path)
pid = pid_path.split("/")[2] # get the PID
# we replace the \x00 to spaces to make a prettier output from kernel
cmdline = f.read().replace("\x00", " ").rstrip()
f.close()
yield (pid, cmdline)
Kontrola seznamu běžících procesů se provádí (dokonce i základními utilitami jako "ps") pohledem na obsah adresáře /proc.
Knihovna, kterou zajímáte pro dotazování běžících procesů, je stejná jako knihovna používaná pro práci s jakýmikoli jinými soubory a adresáři (tj. sys
nebo os
, v závislosti na chuti, kterou hledáte. Zvláštní pozornost věnujte os.path
ačkoli dělá většinu toho, co hledáte). Chcete-li procesy ukončit nebo s nimi jinak interagovat, pošlete jim signály, což se provádí pomocí os.kill
. Nakonec spustíte nové procesy pomocí os.popen
a přátelé.