当我在 GNOME 3.34 的 19.10 上时,我可以使用 GLib 多次生成命令而不会导致 GNOME shell 或任何应用程序出现任何延迟。但是在 GNOME 3.36.1 的 20.04 上,即使是一个简单的生成命令也会给整个 GNOME shell 甚至应用程序造成一些延迟。
为了向您展示我如何做到这一点,我创建了这个简单的 GNOME shell 扩展:
const Mainloop = imports.mainloop;
const GLib = imports.gi.GLib;
let timeout;
function init(){
}
function enable(){
timeout = Mainloop.timeout_add_seconds(1.0,() => {
var [ok, out, err, exit] = GLib.spawn_command_line_sync('pgrep Discord');
log('Discord is running');
return true;
});
}
function disable(){
Mainloop.source_remove(timeout);
}
为什么会出现这种延迟?我该如何修复此代码的延迟问题?
答案1
pgrep
在 Ubuntu 20.04 中运行速度极慢。运行时间与堆栈限制成线性关系(ulimit -S -s
检查),即使在快速机器上也很容易达到 30 秒。如果没有堆栈限制,任何pgrep
调用都将失败:
cannot allocate 4611686018427387903 bytes
Ubuntu(Debian、Archlinux)的 Bug 报告已开放,但未看到任何流量。请考虑标记您也受到了影响:https://bugs.launchpad.net/ubuntu/+source/procps/+bug/1874824
这个错误已经在 procps 中修复,但是发行版并没有发现它......