Best way to prevent zombie processes

Cecil Westerhof Cecil at decebal.nl
Mon Jun 1 08:16:21 EDT 2015


Op Sunday 31 May 2015 23:33 CEST schreef Cecil Westerhof:

> At the moment I have the following code:
> os.chdir(directory)
> for document in documents:
> subprocess.Popen(['evince', document])
>
> With this I can open several documents at once. But there is no way
> to know when those documents are going to be closed. This could/will
> lead to zombie processes. (I run it on Linux.) What is the best
> solution to circumvent this?
>
> I was thinking about putting all Popen instances in a list. And then
> every five minutes walk through the list and check with poll if the
> process has terminated. If it has it can be released from the list.
> Of-course I need to synchronise those events. Is that a good way to
> do it?

With some investigation I decided on something completely different.

I made a class:
    import os
    import subprocess

    from os.path    import expanduser
    from threading  import Thread

    class DocumentsToShow:
        def show_documents(self):
            if self._desktop != -1:
                subprocess.check_call(['wmctrl', '-s', str(self._desktop - 1)])
            os.chdir(self._directory)
            for document in self._documents:
                Popen_without_zombie(['evince', document])

        def __init__(self, name, desktop, directory, documents):
            '''Initialise the class'''

            self._name      = name
            self._desktop   = desktop
            self._directory = expanduser(directory)
            self._documents = documents

And this class uses the following function:
    def Popen_without_zombie(command):
        p = subprocess.Popen(command)
        Thread(target = p.wait).start()

The class takes a name for the collection, which desktop to display it
on, the directory that contains the documents and a list of documents.
With show_documents they are displayed.

How about this way of solving it?


About the improvement of the class. Now it is always evince that is
used to open a document. But it would be nice if it was a little less
picky. What is the preferred way to solve this?
- Defining a set the user can choose from.
- Making it a string parameter and expecting the user to know what he
is doing.

-- 
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof



More information about the Python-list mailing list