在Linux上用Python衍生非Python进程是否分离?

3
我需要制作一个启动器应用程序,但我还没有找到完全从生成的Python进程中分离子进程的方法。
当我使用桌面(cinnamon)的启动器启动程序时,进程树如下所示:
/sbin/init->mdm->mdm->cinnamon-session->cinnamon->我启动的应用程序
在我阅读的讨论中,这篇文章是最有见地和有帮助的: Launch a completely independent process。但由于OP正在寻求运行Python代码,因此答案变得混乱不清,因为通常可以通过许多首选的方式来实现它,而不是生成独立的进程。
从其他Stack Overflow帖子中获得的信息并未回答如何启动分离的Python进程:
  • 运行守护进程化的Python代码:适用于将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
  • 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平台上无法解释。我没有找到任何关于在部分Ref上的可移植性的好参考资料。
  • subprocess.PopenAlt:我仍然只观察到子进程作为Python进程的子进程运行。

我认为我想要问的问题是“如何放弃一个进程”,但我不确定是否真的有完全放弃一个进程的方法,最好的情况可能是由生成进程的父进程拥有。我的目标是运行一个进程,在启动进程关闭后仍然能够存活,我认为唯一可行的选择是从旨在托管其他进程的守护程序中托管该进程,我认为大多数 shell,包括桌面 shell,都拥有这个责任,这就是为什么“使用 bash”似乎是一个可行的选择,尽管有些混乱。请告诉我。 - ThorSummoner
2个回答

1

可以在JonMc的答案这里中找到可行的解决方案。我使用它来使用'xdg-open'打开文档。

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


-1

我唯一可行的解决方案,可能只适用于Linux且不具备可移植性,是使用带有shell-detach-ampersand语法的shell评估。

#!/usr/bin/env python2
import os

os.system('{cmd} &'.format('firefox'))

这可能会超出进程树的范围,超出窗口管理器会话,可能不会随着您的桌面会话退出。

/sbin/init -> firefox


1
我认为这样的方式过程不是分离的。 - Anteino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接