我正在编写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()
吗?
答案 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()
自行添加儿童监视处理程序,并使用GChildWatchFunc
在g_spawn_close_pid()
回调中获取已解散的进程。
有一个示例in this question或another here。