【问题标题】:Python spawn detatched non-python process on linux?Python在Linux上产生分离的非python进程?
【发布时间】:2023-03-05 04:06:01
【问题描述】:

我要制作一个启动器应用程序,但我还没有找到一种方法将子进程完全从产生的 python 进程中分离出来。

当我使用桌面(肉桂)启动器启动程序时,进程树会显示:

/sbin/init -> mdm -> mdm -> cinnamon-session -> cinnamon -> the-app-i-launched

在我阅读的主题中,这是最有见地/最有帮助的主题:Launch a completely independent process。但是当 OP 正在寻求运行 python 代码时,得到的答案很混乱,这通常可以通过许多通常首选的方式来实现,而不是通过产生一个独立的进程。

来自堆栈溢出的其他帖子,这些帖子没有回答如何启动分离的 python 进程:

  • Running daemonalized python code:适用于将 python 代码/模块 作为守护进程运行,(不是另一个进程/应用程序)与 python 实例分离。
  • subprocess.call:进程作为 python 进程的子进程生成。
  • os.system:进程作为 python 进程的子进程生成。
  • close_fds:(显然)仅限 Windows(R) 的解决方案,需要可移植的解决方案(主要目标是 Debian linux)。尝试在 linux 上使用 close_fds=True,进程作为 python 进程的子进程生成。
  • creationflags:仅限 Windows(R) 的解决方案。在 Linux 上引发:ValueError: creationflags is only supported on Windows platforms
  • prefix launched process with nohup:进程作为 python 进程的子进程生成。据我所知,nohup 或等效项并非在所有平台上都可用,这使其成为仅限 linux 的解决方案。
  • os.fork:与“运行守护进程python代码”相同。
  • multiprocessing问题与“运行守护进程 python 代码”相同:仅对运行 python 代码/模块有用。
  • os.spawnl* + os.P_NOWAIT:不推荐使用的函数不适用于新代码。在我的测试中,我根本看不到我的进程实际产生了。
  • os.spawnl* + os.P_DETACH:仅限 Windows(R),在当前的 python 2.X 版本中似乎已删除:AttributeError: 'module' object has no attribute 'P_DETACH'.
  • os.system + shell fork:我实际上能够看到我的进程运行与 python 进程分离,但是我担心它有错误:
    • 依赖于在 shell 中运行命令,这更容易受到恶意、有意或其他方式的攻击?
    • 依赖于不可移植的? POSIX/shell? 语法,这些语法在非 Linux 平台上可能无法相互渗透。我还没有在 Partial Ref 上找到任何关于可移植性的良好参考。
  • subprocess.Popen Alt:我还是只观察到子进程作为python进程的子进程运行。

【问题讨论】:

  • 我想我想问的问题是“如何否认一个进程”,我不确定是否真的有办法完全否认一个进程,充其量它可以归生成进程的父进程。我的目标是运行一个可以在启动过程关闭后继续存在的进程,我认为唯一可行的选择是从一个用于托管其他进程的守护进程托管该进程,我认为大多数 shell,包括桌面 shell,都拥有这个责任,即为什么“使用 bash”似乎是一个可行的选择。尽管有些混乱。请告诉我

标签: python subprocess launcher detach platform-independent


【解决方案1】:

可以在 JonMc 的回答 here 中找到一个可行的解决方案。我用它来使用“xdg-open”打开文档。

如果您不想要日志文件,可以将 stderr 参数更改为 stderr=open('/dev/null', 'w'),

【讨论】:

    【解决方案2】:

    我拥有的唯一可行的解​​决方案是使用带有 shell-detach-ampersand 语法的 shell 评估,这可能是不可移植的 Linux。

    #!/usr/bin/env python2
    import os
    
    os.system('{cmd} &'.format('firefox'))
    

    这可能会在进程树上走得太远,在窗口管理器会话之外,可能不会与您的桌面会话一起退出。

    /sbin/init -> firefox

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-22
      • 2013-05-29
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多