【问题标题】:Gnome shell GLib async process become defunctGnome shell GLib 异步进程失效
【发布时间】:2017-04-28 05:32:53
【问题描述】:

我正在编写一个 gnome shell 扩展并运行一个 bash 脚本

let [, pid, , , ] = imports.gi.GLib.spawn_async(null, args, null, GLib.SpawnFlags.DO_NOT_REAP_CHILD, null);

这行得通,但是在运行几次后我能够看到

ps aux | grep pid

进程在那里,并被标记为已失效。这是正常的吗?我应该清理这些过程吗?或者这是正常行为?

GLib.spawn_async() 的描述确实说要调用GLib.spawn_close_pid(),但描述说:

在某些平台上,尤其是 Windows,GLib.Pid 类型表示必须关闭以防止资源泄漏的资源。为此目的提供了 GLib.spawn_close_pid。它应该在所有平台上使用,即使它在 UNIX 下没有任何作用。

我的系统是ubuntu,我应该打电话给spawn_close_pid()吗?

【问题讨论】:

    标签: javascript linux glib gnome


    【解决方案1】:

    来自G_SPAWN_DO_NOT_REAP_CHILD 的文档:

    孩子不会被自动收割;你必须自己使用g_child_watch_add()(或者调用waitpid()或者自己处理SIGCHLD),否则孩子会变成僵尸。

    所以发生的事情是正常的:子进程正在生成,正在做某事,退出并失效 - 但没有父进程正在收获它。死进程会一直挂起,直到收获,以便父进程可以检查它们的退出状态。

    您需要停止使用GLib.SpawnFlags.DO_NOT_REAP_CHILD 标志(在这种情况下,GLib 将监视子进程退出并自动获取它);或使用g_child_watch_add() 自己添加一个子监视处理程序,并使用g_spawn_close_pid()GChildWatchFunc 回调中获取已失效的进程。

    有一个例子in this questionanother here

    【讨论】:

    • 删除该标志就可以了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2023-04-09
    • 1970-01-01
    • 2011-11-12
    • 2011-08-13
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多