在termin上使用e选项的python后台进程

2024-05-12 18:37:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想编写一个基于控制台的包装器来启动一个程序,除非我尝试使用“urxvt-emyscript”或其他变体来运行它,否则它可以正常工作。例如:

在测试.py在

#!/usr/bin/python2.7
import subprocess

print 'Press enter to launch'
raw_input()

subprocess.Popen( ['firefox'] )

如果我在终端上运行这个/测试.py,它按预期工作。Firefox启动时,脚本存在。但如果我用“urxvt-e”试试这个/测试.py'脚本打开、运行,然后firefox启动。但是当脚本退出时,firefox就会被杀死。在

如果我使用“term-e script”运行脚本,如何启动一个程序,使其在脚本退出时不被终止。在

编辑:为了更清楚: 我想启动一个运行python脚本的新终端。脚本完成它的工作并启动程序。然后脚本退出,终端关闭,程序继续运行。在


Tags: pyimport程序脚本终端binusr变体
3条回答

并启动(&;符号)来添加。在

subprocess.Popen( ['firefox &'] )

在测试时,我发现结果高度依赖于要启动的程序,而这个问题与python无关。我从来没有注意到,但“术语-e程序”只适用于某些程序,其他程序则会以我所得到的行为退出。有些程序不保留继承的pid/sid,而有些程序则保留继承的pid/sid。在

例如

>>> print os.getpid()
3556
>>> os.execl( '/usr/bin/gvim', 'gvim' )

一个快速的“ps-e”显示

^{pr2}$

当启动终端关闭时,具有相同sid的所有进程都将关闭。所以“gvim失效”消失了,但另一个仍然存在。当启动终端关闭时,没有获得新的pid/sid的程序将退出。解决方案是在进程上强制使用一个新的sid。在

import os

if os.fork():
    # parent
    do_stuff()

else:
    # child
    os.setsid()
    os.execl('prog', 'prog')
import os

print 'Press enter to launch'
raw_input()

if os.fork():
    # Parent
    print 'clean up'
    raw_input()

else:
    # Child
    os.execl('/usr/bin/firefox', 'firefox')

os.execl用firefox进程替换python进程。在

正如你所说子流程.Popen,当脚本结束时,firefox子进程被终止。在

使用os.execl,脚本本身不会结束。它被firefox进程取代,而firefox进程不会(立即)结束(也不会被终止)。一旦到达os.execl命令,它的行为就像您调用了term -e firefox一样有效。在

相关问题 更多 >