启动一个完全独立的过程


问题内容

我想从我的python脚本启动一个进程main.py。具体来说,我想运行以下命令:

`nohup python ./myfile.py &`

并且myfile.py即使main.py脚本退出,文件也应继续运行。

我也希望了解pid新流程。

我试过了:

  • os.spawnl*
  • os.exec*
  • subprocess.Popen

并且所有脚本都将myfile.pymain.py退出时终止。


更新: 我可以用os.startfilexdg-open?这是正确的方法吗?


a = subprocess.Popen([sys.executable, "nohup /usr/bin/python25 /long_process.py &"],\
     stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print a.pid

如果我检查ps aux | grep long_process,则没有进程在运行。

long_process.py ,它继续打印一些文本:没有出口。

我在这里做错什么吗?


问题答案:

您打开长期运行的进程并 对其进行管理 。因此,您希望与之交谈。当启动器脚本退出时,您将无法与其进行对话。
长时间运行的进程接收到aSIGPIPE并退出。

以下内容对我来说很有效(Linux,Python 2.7)。

创建一个长期运行的可执行文件:

$ echo "sleep 100" > ~/tmp/sleeper.sh

运行Python REPL:

$ python
>>>

import subprocess
import os
p = subprocess.Popen(['/bin/sh', os.path.expanduser('~/tmp/sleeper.sh')])
# look ma, no pipes!
print p.pid
# prints 29893

退出REPL,然后查看进程仍在运行:

>>> ^D
$ ps ax | grep sleeper
29893 pts/0    S      0:00 /bin/sh .../tmp/sleeper.sh
29917 pts/0    S+     0:00 grep --color=auto sleeper

如果要先与已启动的进程进行通信,然后再让它继续运行,则有几种选择:

  • 处理SIGPIPE您长期运行的过程,不要死于它。启动器进程退出后,无需stdin即可生存。
  • 使用参数,环境或临时文件传递您想要的任何内容。
  • 如果要进行双向通信,请考虑使用命名管道(man mkfifo)或套接字,或编写适当的服务器。
  • 在初始双向通信阶段完成后,使长时间运行的流程分支。