您打开长期运行的进程并 对其进行管理 。因此,您希望与之交谈。当启动器脚本退出时,您将无法与其进行对话。长时间运行的进程接收到aSIGPIPE
并退出。
以下内容对我来说很有效(Linux,Python 2.7)。
创建一个长期运行的可执行文件:
$ echo "sleep 100" > ~/tmp/sleeper.sh
运行Python REPL:
$ python>>>import subprocessimport osp = subprocess.Popen(['/bin/sh', os.path.expanduser('~/tmp/sleeper.sh')])# look ma, no pipes!print p.pid# prints 29893退出REPL,然后查看进程仍在运行:
>>> ^D$ ps ax | grep sleeper29893 pts/0 S 0:00 /bin/sh .../tmp/sleeper.sh29917 pts/0 S+ 0:00 grep --color=auto sleeper
如果要先与已启动的进程进行通信,然后再让它继续运行,则有几种选择:
- 处理
SIGPIPE
您长期运行的过程,不要死于它。启动器进程退出后,无需stdin即可生存。 - 使用参数,环境或临时文件传递您想要的任何内容。
- 如果要进行双向通信,请考虑使用命名管道(man mkfifo)或套接字,或编写适当的服务器。
- 在初始双向通信阶段完成后,使长时间运行的流程分支。



