我想设置一个新开始的进程的父进程,这可能吗?
例如,假设我们通过登录管理器启动了一个新的桌面环境会话,因此我们的流程树如下所示:
init
\- login-manager
\- de-session现在,我确实有了一个脚本来启动我最重要的应用程序,它应该从会话开始,出于各种原因,我希望将它们保留为脚本,而不是将它们迁移到任何DE的自动启动管理器。看起来是这样的:
#!/usr/bin/env
application1 &
application2 &
application3 &在会话开始时自动运行此操作之后,我们的进程树如下所示:
init
|- application1
|- application2
|- application3
\- login-manager
\- de-session但我实际上想要的是在会话中“重新创建”这些进程,如下所示:
init
\- login-manager
\- de-session
|- application1
|- application2
\- application3那么,在另一个进程下是否有任何方法来“重新启用”一个过程?
发布于 2017-09-03 10:02:00
在一些系统中,您可以将一个进程标记为一个子收割机,这使得它承担了init的S角色,即为它的所有后代采用孤儿进程。
在Linux上,这是通过PR_SET_CHILD_SUBREAPER prctl()完成的。
因此,您可以将de-session启动为(此处硬编码用于Linux的PR_SET_CHILD_SUBREAPER值):
perl -e 'require "syscall.ph";
syscall(&SYS_prctl,36,1) >= 0 or die "cannot set subreaper: $!";
exec("de-session");'但是,当de-session接收到它从未生成的进程的SIGCHLD信号时,它可能会感到困惑。您的init被设计用来处理这些问题,但可能不是您的de-session,所以您可能会发现您得到了一群僵尸,因为de-session从未承认它从未想要继承的进程的死亡。
https://unix.stackexchange.com/questions/390061
复制相似问题