簡體   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