启动一个完全独立的过程
问题内容:
我想从我的python脚本启动一个进程main.py
。具体来说,我想运行以下命令:
`nohup python ./myfile.py &`
并且myfile.py
即使main.py
脚本退出,文件也应继续运行。
我也希望了解pid
新流程。
我试过了:
os.spawnl*
os.exec*
subprocess.Popen
并且所有脚本都将myfile.py
在main.py
退出时终止。
更新: 我可以用os.startfile
用xdg-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)或套接字,或编写适当的服务器。
- 在初始双向通信阶段完成后,使长时间运行的流程分支。