繁体   English   中英

Gnome Shell GLib异步过程已失效

[英]Gnome shell GLib async process become defunct

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

G_SPAWN_DO_NOT_REAP_CHILD的文档中:

不会自动收割孩子; 您必须自己使用g_child_watch_add() (或调用waitpid()或自己处理SIGCHLD ),否则该孩子将成为僵尸。

因此,发生的事情是正常的:子进程正在生成,正在执行某些操作,退出并变得不再运行-但没有父进程正在收获它。 死进程一直徘徊直到被收割,以便父进程可以检查其退出状态。

您需要停止使用GLib.SpawnFlags.DO_NOT_REAP_CHILD标志(在这种情况下,GLib将监视正在退出的子进程并自动获得它)。 或添加使用儿童观察处理自己g_child_watch_add()并在收获解散过程GChildWatchFunc使用回调g_spawn_close_pid()

这个问题有一个例子,这里有 另一个例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM