我从这样的网络应用程序中生成了一个可以长时间运行的脚本:
os.spawnle(os.P_NOWAIT, "../bin/producenotify.py", "producenotify.py", "xx",os.environ)
脚本成功生成并运行,但是直到结束为止,我无法释放该Web应用程序使用的端口,换句话说,我无法重新启动该Web应用程序。我如何产生一个流程并使它完全独立于Web应用程序?
这是在Linux操作系统上。
正如@mark所阐明的那样,它是一个Linux系统,通过遵循此食谱,脚本可以轻松地使其自身完全独立,即
守护程序
。(您也可以在子进程之后,然后在子进程中在父进程中执行此操作)。os.fork``os.exec...
编辑:澄清一些细节wrt
@mark对我的回答的评论:不需要超级用户权限即可按照菜谱配方“守护”进程,也无需更改当前工作目录(尽管配方确实可以做到这一点,而且,这不是关键部分-
而是fork
,_exit
和setsid
调用的正确逻辑顺序。 不会 在父进程环境中使用的各种os.exec...
变体都 不会
终止e
,因此这部分也很容易-
请参阅Python在线文档。
要解决在其他人的评论和答案中提出的建议:我相信subprocess
并且multiprocessing
本身不会守护子进程,这似乎是@mark所需要的;该脚本可以自己完成操作,但是由于
某些
代码必须执行fork
s和setsid
,所以对我而言,将所有生成都保留在该低层平面上似乎比较整洁,而不是在其中混合一些高层和一些低层代码手术过程。
这是上述URL处配方的大大简化版本,专门用于在父级中调用以生成守护程序子级—这样,该代码也可以用于执行非Python可执行文件。如给定的那样,该代码应满足@mark解释的需求,当然可以通过多种方式对其进行定制-
我强烈建议阅读原始配方及其注释和讨论以及其推荐的书,以获取更多信息。
import os
import sys
def spawnDaemon(path_to_executable, *args)
"""Spawn a completely detached subprocess (i.e., a daemon).
E.g. for mark:
spawnDaemon("../bin/producenotify.py", "producenotify.py", "xx")
"""
# fork the first time (to make a non-session-leader child process)
try:
pid = os.fork()
except OSError, e:
raise RuntimeError("1st fork failed: %s [%d]" % (e.strerror, e.errno))
if pid != 0:
# parent (calling) process is all done
return
# detach from controlling terminal (to make child a session-leader)
os.setsid()
try:
pid = os.fork()
except OSError, e:
raise RuntimeError("2nd fork failed: %s [%d]" % (e.strerror, e.errno))
raise Exception, "%s [%d]" % (e.strerror, e.errno)
if pid != 0:
# child process is all done
os._exit(0)
# grandchild process now non-session-leader, detached from parent
# grandchild process must now close all open files
try:
maxfd = os.sysconf("SC_OPEN_MAX")
except (AttributeError, ValueError):
maxfd = 1024
for fd in range(maxfd):
try:
os.close(fd)
except OSError: # ERROR, fd wasn't open to begin with (ignored)
pass
# redirect stdin, stdout and stderr to /dev/null
os.open(os.devnull, os.O_RDWR) # standard input (0)
os.dup2(0, 1)
os.dup2(0, 2)
# and finally let's execute the executable for the daemon!
try:
os.execv(path_to_executable, args)
except Exception, e:
# oops, we're cut off from the world, let's just give up
os._exit(255)
我正在使用azure sdk从azure密钥库获取密钥。这将返回一个KeyBundle,它的key属性类型为 对于我的代码的不同部分,我需要从jwCrypto JWK制作一个签名令牌。make_signed_token方法使用JsonWebKey。从Azure返回的JsonWebKey(我认为)实际上是同一个类,在不同的包中定义。 有没有办法将Azure JWK变成jwcrypto JWK?我认为
本文向大家介绍python通过matplotlib生成复合饼图,包括了python通过matplotlib生成复合饼图的使用技巧和注意事项,需要的朋友参考一下 可以通过matplotlib实现 输出: 图源数据为快餐店销量 总结 以上所述是小编给大家介绍的python通过matplotlib实现生成复合饼图,希望对大家有所帮助!
前面章节中,已经详细介绍了什么是迭代器。生成器本质上也是迭代器,不过它比较特殊。 以 list 容器为例,在使用该容器迭代一组数据时,必须事先将所有数据存储到容器中,才能开始迭代;而生成器却不同,它可以实现在迭代的同时生成元素。 也就是说,对于可以用某种算法推算得到的多个数据,生成器并不会一次性生成它们,而是什么时候需要,才什么时候生成。 不仅如此,生成器的创建方式也比迭代器简单很多,大体分为以下
我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过jooq代码生成。 [INFO]--jooq-codegen-maven:3.11.10:generate(默认cli)@http网关--[INFO]跳过jooq代码生成 为了运行Jooq代码生成,我应该执行哪个mvn cmd?现在我使用: 谢谢
我在一个现有的EMF项目中有一个Ecore模型,希望通过Xtend将所有包含类的名称打印到一个文本文件中。你是如何做到这一点的?XTend示例没有展示如何使用模型并从中获取信息。
问题内容: 我正在寻找一个易于实现的python html生成器。我找到了这个 但是无法为表添加CSS元素(ID,类)。 谢谢 问题答案: 如果您希望通过程序生成而不是模板生成,那么Karrigell的HTMLTags模块是一种可能。它可以通过大写其首字母的技巧(例如,引用我刚刚给出的doc URL)来包括例如属性(在Python中为保留字)。 与Python关键字(类,类型)同名的属性必须大写: