Gnome shell GLib异步进程变得不存在

时间:2017-04-28 05:32:54

标签: javascript linux glib gnome

我正在编写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()吗?

1 个答案:

答案 0 :(得分:3)

来自G_SPAWN_DO_NOT_REAP_CHILD的文档:

  

孩子不会被自动收获;您必须自己使用g_child_watch_add()(或致电waitpid()或自己处理SIGCHLD),否则孩子将变成僵尸。

所以正在发生的事情是正常的:子进程正在产生,做某事,退出并变得不存在 - 但没有父进程正在收获它。死机进程一直存在,直到收到,以便父进程可以检查它们的退出状态。

您需要停止使用GLib.SpawnFlags.DO_NOT_REAP_CHILD标志(在这种情况下,GLib会监视子进程退出并自动获取);或使用g_child_watch_add()自行添加儿童监视处理程序,并使用GChildWatchFuncg_spawn_close_pid()回调中获取已解散的进程。

有一个示例in this questionanother here