How to spawn detached background process on Linux

2019-02-19 07:16发布

问题:

I have a long running python script on Linux, and in some situations it needs to execute a command to stop and restart itself. So, I would like to have an external script (either in bash or python) that executes command to restart the original script. Let me elaborate.

Suppose I have original_script.py. In original_script.py I have this in an infinite loop:

if some_error_condition:
    somehow call external script external.sh or external.py

Let's suppose I can call external.sh and it contains this:

#!/bin/bash
command_to_restart_original_script

Finally, I know the command "command_to_restart_original_script". That isn't the problem. What need is the python command to "somehow call external script external.sh". I need the external script (which is a child process) to keep running as the parent process original_script.py is restarting, ie I need the child process to be detached/daemonized. How do I do this?

回答1:

I found lots of suggestions in various places, but the only answer that worked for me was this: How to launch and run external script in background?

import subprocess subprocess.Popen(["nohup", "python", "test.py"])

In my case I ran a script called longrun.sh so the actual command is:

import subprocess subprocess.Popen(["nohup", "/bin/bash", "longrun.sh"])

I tested this using this run.py:

import subprocess
subprocess.Popen(["nohup", "/bin/bash", "longrun.sh"])
print "Done!"

and I verified (using ps -ax | grep longrun) that longrun.sh does indeed run in the backgreoun long after run.py exits.