【问题标题】:How do I reliably track child/grandchild processes on a POSIX system?如何可靠地跟踪 POSIX 系统上的子/孙进程?
【发布时间】:2010-11-02 01:25:18
【问题描述】:

我有一个有趣的(至少对我而言)问题:在某些情况下,我无法找到可靠且可移植地获取孙进程信息的方法。我有一个应用程序AllTray,我试图在某些奇怪的情况下开始工作,其中它的子进程产生一个孩子然后死去。 AllTray 的工作本质上是将应用程序停靠在任务托盘上,任务托盘(通常)被指定为 AllTray 调用的命令行(即alltray xterm 将启动 xterm,并在 AllTray 中对其进行管理)。

大多数 GUI 软件在它下都可以正常运行。它在其窗口上设置了_NET_WM_PID 属性(或小部件库),一切都很好,因为_NET_WM_PID == fork()ed 孩子。然而,在某些情况下(例如运行oowriter,或编写为在 KDE 下运行的软件,如 K3b),AllTray 运行的子进程是一个包装器,它是一个 shell 脚本(如 OO.o 的情况)或一个奇怪的程序,fork()s 和 exec()s 本身并有效地将自身背景化,因为父进程很早就死了。

我的想法是不获取我的子进程,以便在进程表中保留我孙子的父进程 ID,以便我可以通过从下到上遍历家谱来将它们链接回我.但是,这不起作用:一旦我的子进程死亡并变成僵尸,系统就会认为我的孙子进程是孤儿,init 会采用它。至少在 Linux 2.6 和 NetBSD 上似乎是这样。我想这可能是常态,而 POSIX 似乎并没有明确规定是这种情况,所以我希望相反。

由于这种方法行不通,我考虑使用LD_PRELOAD 并拦截我的子进程对fork() 的调用,并将信息传递回我的父进程。但是,我担心它不会像理想的解决方案那样可移植,因为不同的系统对于动态链接器如何执行LD_PRELOAD 之类的操作有不同的规则。如果没有帮助程序库也是 setuid 或 setgid,它就不适用于 setuid/setgid GUI 应用程序,至少在 Linux 系统上是这样。一般来说,这对我来说是个坏主意,而且感觉很hackish。

所以,我希望有人知道如何做到这一点,或者如果依赖像 LD_PRELOAD 这样的机制的想法真的是我唯一没有修补内核的选择(这是 不会发生)。

【问题讨论】:

    标签: linux unix process posix


    【解决方案1】:

    您可以调查使用process groups 来跟踪进程组的可能性。进程组是一个属性(只是一个数字),您可以在分叉之前设置它,然后子进程会自动继承它。

    AllTray 可以为使用它启动的每个应用程序创建一个新的进程组。您可以向进程组的所有成员发送信号。我想这里最有用的信号是 TERM 和 KILL,以便终止在 AllTray 中管理的应用程序。

    我不确定是否有一种方便的方法来确定进程组的所有成员是否已经退出。您可能不得不求助于浏览整个进程列表并为每个进程调用getpgid,以查看进程组中是否还有剩余。

    请注意,进程组不适用于自己创建新进程组的应用程序。但这种情况比较少见,您可能无需担心此类应用程序。

    【讨论】:

    • 人力资源部。我会看看这个,看看会发生什么。不过,这个主意听起来不错。是否有任何理由仅创建一个新的单个进程组是不够的?目前 AllTray 只管理一个应用程序,并且最终会管理更多,但如果一个 pgid 可以完成这项工作,只是为了找到它应该照顾的进程,那就足够了,我想。
    • 我可以想象如果包装器通过 kdeinit 启动 KDE 4.3 或 Firefox(如果它已经打开其他窗口等)会失败......在这些情况下,新窗口由完全不同的树中的进程创建。
    • @ephemient 我知道 KDE 应用程序会做一些奇怪的事情,它们是我试图解决的问题之一。当已经有一个进程在运行时,我对 FF 或 gnome-terminal 无能为力,尽管我有一些想法试图让它按照用户的意思去做,我认为是可能的。
    • 感谢 Ville,这绝对是我需要做的。而且 KDE 应用程序比我想象的还要怪异……但我现在已经让它们(和 OOo)工作了。非常感谢!
    猜你喜欢
    • 2012-06-20
    • 2015-09-26
    • 2023-04-07
    • 2011-12-18
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2014-05-07
    相关资源
    最近更新 更多