Dato che hai detto che si tratta di un server Linux, chiama il ps esterno binario è solitamente più lento, utilizza più risorse ed è più soggetto a errori rispetto all'utilizzo delle informazioni da /proc direttamente.
Poiché nessun altro ha menzionato, un modo semplice è:
glob.glob('/proc/[0-9]*/')
Buona fortuna.
Per avviare/arrestare i sottoprocessi python puoi usare il modulo subprocess. Per verificare se sono in esecuzione puoi usare psutil:
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
...o questo (verificherà anche se il PID è stato riutilizzato):
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
Questo è quello che uso. Usa procfs (quindi sei limitato a sistemi simili a Unix, non funzionerà su Mac credo) e il glob. Ottiene anche la cmdline, che consente di identificare il processo. Per uccidere il processo puoi usare os.kill(signal.SIGTERM, pid)
. Per utilizzare il sottoprocesso, controlla questo post Python, Popen e seleziona - in attesa della fine di un processo o di un timeout
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)
Il controllo dell'elenco dei processi in esecuzione viene eseguito (anche da utilità di base come "ps") osservando il contenuto della directory /proc.
Pertanto, la libreria che ti interessa per interrogare i processi in esecuzione è la stessa utilizzata per lavorare con qualsiasi altro file e directory (ad es. sys
o os
, a seconda del sapore che stai cercando. Presta particolare attenzione a os.path
tuttavia, fa la maggior parte di ciò che cerchi). Per terminare o interagire in altro modo con i processi, invii loro dei segnali, cosa che si ottiene con os.kill
. Infine, inizi nuovi processi usando os.popen
e amici.