[英]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.