Search code examples
pythonsubprocessdetachetcd

Pythonic way to detach a process?


I'm running an etcd process, which stays active until you kill it. (It doesn't provide a daemon mode option.) I want to detach it so I can keep running more python.

What I would do in the shell;

etcd & next_cmd

I'm using python's sh library, at the enthusiastic recommendation of the whole internet. I'd rather not dip into subprocess or Popen, but I haven't found solutions using those either.

What I want;

sh.etcd(detach=True)
sh.next_cmd()

or

sh.etcd("&")
sh.next_cmd()

Unfortunately detach is not a kwarg and sh treats "&" as a flag to etcd.

Am I missing anything here? What's the good way to do this?


Solution

  • To implement sh's &, avoid cargo cult programming and use subprocess module directly:

    import subprocess
    
    etcd = subprocess.Popen('etcd') # continue immediately
    next_cmd_returncode = subprocess.call('next_cmd') # wait for it
    # ... run more python here ...
    etcd.terminate() 
    etcd.wait()
    

    This ignores exception handling and your talk about "daemon mode" (if you want to implement a daemon in Python; use python-daemon. To run a process as a system service, use whatever your OS provides or a supervisor program such as supervisord).