Wait Until A Certain Process (knowing The "pid") End
Solution 1:
I'm not really a Python programmer, but apparently Python does have os.waitpid()
. That should consume less CPU time and provide a much faster response than, say, trying to kill the process at quarter-second intervals.
Addendum: As Niko points out, os.waitpid()
may not work if the process is not a child of the current process. In that case, using os.kill(pid, 0)
may indeed be the best solution. Note that, in general, there are three likely outcomes of calling os.kill()
on a process:
- If the process exists and belongs to you, the call succeeds.
- If the process exists but belong to another user, it throws an
OSError
with theerrno
attribute set toerrno.EPERM
. - If the process does not exist, it throws an
OSError
with theerrno
attribute set toerrno.ESRCH
.
Thus, to reliably check whether a process exists, you should do something like
def is_running(pid):
try:
os.kill(pid, 0)
except OSError as err:
if err.errno == errno.ESRCH:
return False
return True
Solution 2:
Since that method would only work on linux, for linux/osx support, you could do:
import time
import os
def is_running(pid):
stat = os.system("ps -p %s &> /dev/null" % pid)
return stat == 0
pid = 64463
while is_running(pid):
time.sleep(.25)
Edit - Per tMc's comment about excessive processes
Referencing: How to check if there exists a process with a given pid in Python?
Wouldn't this use less resources (I havent tested), than listing on the filesystem and opening FDs to all the results?
import time
import os
def is_running(pid):
try:
os.kill(pid, 0)
except OSError:
return False
return True
pid = 64463
while is_running(pid):
time.sleep(.25)
Solution 3:
import time
, then use time.sleep(#)
:
import time
process = get_process()
if process == None:
#do something
else:
#Wait until the process end
while is_running(process):
time.sleep(0.25)
I also have that exact same function in several of my scrips to read through /proc/#/cmdline
to check for a PID.
Solution 4:
A simple and reliable way of doing this with Python is by getting a list of PIDs with psutil, and then checking if your PID is in that list of running PIDs:
import psutil
def check_pid(pid):
if int(pid) in psutil.pids(): ## Check list of PIDs
return True ## Running
else:
return False ## Not Running
To use it, just run it in a simple while loop.
pid = 1000
running = True
while running == True:
running = check_pid(int(pid))
(Do stuff *until* PID ends)
(Do stuff *after* PID ends)
Or you could just put all that into one function...
def pause_while_running(pid):
running = True
while running:
if int(pid) not in psutil.pids():
running = False
time.sleep(5)
and use like
pause_while_running(pid)
(do stuff after PID ended)
Post a Comment for "Wait Until A Certain Process (knowing The "pid") End"