How to avoid hanging Xvfb processes [while using PyVirtualDisplay]?
Asked Answered
V

3

12

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!

Vachon answered 27/8, 2013 at 22:28 Comment(1)
Assuming pyvirtualdisplay uses 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
O
8

Your display, since it inherits from EasyProcess, will have a popen attribute at display.popen. You can use this to terminate, if EasyProcess isn't working properly.

So, you can do something like this:

display.popen.terminate()

or

display.popen.kill()
Ortegal answered 16/9, 2013 at 15:25 Comment(2)
Thanks. What happens if I don't have access to the display object anymore? Is there a nicer way of doing a kill than using an OS call?Vachon
That's what it's doing behind the scenes too, actually. The answer is no, not really. os.kill is pretty good actually. It's a decent interface and you can handle exceptions easily enough.Ortegal
M
8

The answer by Jordan did not work for me. This worked:

display.sendstop()
Minardi answered 15/2, 2016 at 22:5 Comment(0)
C
2

FYI, none of these solutions work for me. It says display doesn't have an attribute sendstop or popen.

Card answered 4/5, 2022 at 17:9 Comment(1)
Indeed, but it seems using stop method now stops the process (at least for me it did)Ambassador

© 2022 - 2024 — McMap. All rights reserved.