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