Ho uno script python che sta utilizzando i comandi SIGSTOP e .SIGCONT con os.kill per mettere in pausa o riprendere un processo. C'è un modo per determinare se il PID correlato si trova nello stato di pausa o di ripresa?C'è un modo per determinare se un PID Linux è in pausa o no?
risposta
È possibile trovare informazioni su un processo dalla sua directory/proc (/proc/<PID>
). In particolare, è possibile trovare il suo stato eseguito con questa espressione python:
open(os.path.join('/proc', str(pid), 'stat')).readline().split()[2]=='T'
EDIT: Questa espressione successiva corregge un bug (presumibilmente raro) con l'originale:
re.sub(r'\(.*\)', '()', open(os.path.join('/proc', str(pid), 'stat')).readline()).split()[2]=='T'
chiamare ps e controllare il valore STAT. D continuità del sonno (di solito IO) R in esecuzione o eseguibile (in coda di esecuzione) S sonno Interrompibile (in attesa di un evento per il completamento) T Arrestato, sia da un segnale di controllo di lavoro o perché è tracciata. W paging (non valido dal kernel 2.6.xx) X dead (non dovrebbe mai essere visto) Z Defunct ("zombie") processo, terminato ma non raccolto dal suo genitore.
Grazie, ho usato ps axo fname, stat, pid e ha funzionato esattamente come hai detto tu, non sapevo che il valore STAT fosse per quello. – CobraBytez
È possibile utilizzare psuti l:
>>> import psutil
>>> pid = 1243
>>> p = psutil.Process(pid)
>>> p.status
0
>>> str(p.status)
'running'
>>> p.status == psutil.STATUS_RUNNING
True
>>>
>>> p.suspend()
>>> p.status
3
>>> str(p.status)
'stopped'
>>> p.status == psutil.STATUS_STOPPED
True
>>>
>>> p.resume()
>>> str(p.status)
'running'
>>>
Non usando os.path.join! ... aspetta, questa è pura domanda di linux. – janislaw
@janislaw - grazie. –