当前位置: 首页 > 面试题库 >

从python生成过程

邵展
2023-03-14
问题内容

我从这样的网络应用程序中生成了一个可以长时间运行的脚本:

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_exitsetsid调用的正确逻辑顺序。 不会 在父进程环境中使用的各种os.exec...变体都 不会
终止e,因此这部分也很容易-
请参阅Python在线文档。

要解决在其他人的评论和答案中提出的建议:我相信subprocess并且multiprocessing本身不会守护子进程,这似乎是@mark所需要的;该脚本可以自己完成操作,但是由于
某些
代码必须执行forks和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关键字(类,类型)同名的属性必须大写: