Trying to find how to avoid hanging Xvfb processes in our Python application, when using PyVirtualDisplay. The essential problem is that calling display.stop()
(see code sample below) does not seem to properly shut down the Xvfb process.
PyVirtualDisplay is very simply used:
from pyvirtualdisplay import Display
display = Display(backend='xvfb')
display.start()
... # Some stuff happens here
display.stop()
Now, the Display class has a slight modification to prevent Xvfb from using TCP ports: basically, add -nolisten tcp
to the executing command. The modification is done by overriding the appropriate XfvbDisplay class's _cmd property:
@property
def _cmd(self):
cmd = [PROGRAM,
dict(black='-br', white='-wr')[self.bgcolor],
'-screen',
str(self.screen),
'x'.join(map(str, list(self.size) + [self.color_depth])),
self.new_display_var,
'-nolisten',
'tcp'
]
return cmd
What is the proper way to end the Xvfb processes in this context so that they are terminated and do not linger?
Thanks very much!
subprocess.Popen
, you could call terminate on those objects. If you can't get access to those, then you could try using os.kill on all child processes. – Bookman