文件浏览器和文件对话框需要很长时间才能在所有应用程序中打开或无法打开

Col*_*jac 7 gnome nautilus i3-wm 20.04

我正在使用 Ubuntu 20.04,将 i3 作为窗口管理器,但安装了 gnome 子系统。

我有一个问题,在重新启动后的某个随机时间间隔(数小时或数天)内,任何尝试打开 thunar 或 nautilus,或应用程序(例如 Firefox)打开文件对话框的任何尝试都需要一分钟或更长时间才能打开,或者只是永远超时并要求我终止应用程序。

我如何才能找出造成此延迟的应用程序、文件、扩展名或驱动程序?

我尝试了以下方法:

  • 以 root 身份运行 - 应用程序正常运行。
  • 禁用跟踪器(根据此处
  • libgoa 似乎是最新的(如此
  • 这里尝试了pulseaudio hack
  • 使用 strace 运行 nautilus;下面几行有 30 秒的间隔,但我不确定如何解释它(fd=24 是某个文件描述符?)
  • journalctl 当(例如)鹦鹉螺终于工作时显示以下内容

我有几台设置非常相似的机器,只有一台有这种行为。我无法弄清楚什么应用程序或库是罪魁祸首。

的输出strace -t -o /tmp/nautilus nautilus

20:15:32 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 poll([{fd=24, events=POLLIN}], 1, 0) = 1 ([{fd=24, revents=POLLIN}])
20:15:32 read(24, "\1\0\0\0\0\0\0\0", 16) = 8
20:15:32 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 futex(0x56241fa9c880, FUTEX_WAKE_PRIVATE, 2147483647) = 0
20:15:32 close(24)                      = 0
20:15:32 eventfd2(0, EFD_CLOEXEC|EFD_NONBLOCK) = 24
20:15:32 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 write(6, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 futex(0x56241ef26dc0, FUTEX_WAKE_PRIVATE, 1) = 1
20:15:32 futex(0x56241ef26910, FUTEX_WAKE_PRIVATE, 1) = 1
20:15:32 futex(0x56241ef1c038, FUTEX_WAKE_PRIVATE, 1) = 1
20:15:32 poll([{fd=24, events=POLLIN}], 1, 25000) = 1 ([{fd=24, revents=POLLIN}])
20:15:32 read(24, "\1\0\0\0\0\0\0\0", 16) = 8
20:15:32 poll([{fd=24, events=POLLIN}], 1, 25000) = 0 (Timeout)
20:15:57 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:57 futex(0x56241fa9c880, FUTEX_WAKE_PRIVATE, 2147483647) = 0
20:15:57 close(24)                      = 0
Run Code Online (Sandbox Code Playgroud)

来自杂志:

Apr 20 20:32:35 aubrey dbus-daemon[1180]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service' requested by ':1.134190' (uid=1000 pid=1450204 comm="nautilus " label="unconfined")
Apr 20 20:32:35 aubrey systemd[1]: Starting Hostname Service...
Apr 20 20:32:35 aubrey dbus-daemon[1180]: [system] Successfully activated service 'org.freedesktop.hostname1'
Apr 20 20:32:35 aubrey systemd[1]: Started Hostname Service.
Apr 20 20:32:35 aubrey nautilus[1450204]: Called "net usershare info" but it failed: Failed to execute child process “net” (No such file or directory)
Apr 20 20:32:45 aubrey ddclient[1450366]: WARNING:  file /var/cache/ddclient/ddclient.cache, line 3: Invalid Value for keyword 'ip' =
Run Code Online (Sandbox Code Playgroud)

编辑:

上面的跟踪只是输出strace -t -o /tmp/nautilus nautilus- 一个非常详细的日志,但是tail -f我可以在它挂起的地方检查它,这是我看到一个条目的地方,例如20:15:32 poll([{fd=7, events=POLLIN}], 1, 25000) = 0 (Timeout)后面跟着 30+ 秒的空(然后它开始并且再次非常冗长)。

lsof 报告的 fd,如果我没看错的话,看起来像:

nautilus 1719429 coljac 7u a_inode 0,13 0 17491 [eventfd]

来自顶部的条目strace -c nautilus如下(是的,民意调查是第一):

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 22.70    0.011333           2      3988           poll
 16.55    0.008265           1      5018      4490 stat
  9.31    0.004647           2      1966       131 futex
  7.73    0.003859           1      2119      1385 recvmsg
  7.33    0.003660           1      3612      1441 openat
  4.76    0.002375           2      1038       436 access
  4.29    0.002140           1      1424           read
  3.60    0.001799           1      1356       105 readlink
  3.50    0.001748           0      1868           mmap
  3.30    0.001646           8       188           getdents64
  3.14    0.001568           0      2232           close
  2.38    0.001188           0      1758           fstat
  2.14    0.001067           0      1150           munmap
  1.99    0.000993           2       337           writev
  1.67    0.000833          92         9           clone
  1.57    0.000782           2       367           write
  1.47    0.000733           3       190           mprotect
Run Code Online (Sandbox Code Playgroud)

输出lsof | wc -l1340334

编辑2:

目前,thunar 根本无法打开 - 它会失败并显示消息Failed to register: Timeout was reached。输出strace -c thunar如下:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 50.53    0.002814           3       882       792 openat
 28.21    0.001571           4       354           mmap
  4.79    0.000267           2        96           read
  3.75    0.000209           2        90           fstat
  3.54    0.000197           2        96           close
  3.48    0.000194           1       109           mprotect
  1.87    0.000104           5        18           poll
  1.45    0.000081           0       165         1 futex
  1.31    0.000073           2        28           write
...
Run Code Online (Sandbox Code Playgroud)

如果我运行,strace -t thunar我也会在它挂起之前在输出中看到这个:

futex(0x564445b9ff70, FUTEX_WAKE_PRIVATE, 1) = 1
poll([{fd=7, events=POLLIN}], 1, 25000) = 1 ([{fd=7, revents=POLLIN}])
read(7, "\1\0\0\0\0\0\0\0", 16)         = 8
poll([{fd=7, events=POLLIN}], 1, 25000  

Run Code Online (Sandbox Code Playgroud)

lsof -p <pid> 返回以下内容:

thunar  2036483 coljac    7u  a_inode               0,13        0    17491 [eventfd]
Run Code Online (Sandbox Code Playgroud)

还有一些strace thunar无法打开的outout from是:

20:29:32 read(7, "\1\0\0\0\0\0\0\0", 16) = 8
20:29:32 poll([{fd=7, events=POLLIN}], 1, 25000) = 0 (Timeout)
20:29:58 write(7, "\1\0\0\0\0\0\0\0", 8) = 8
20:29:58 futex(0x5566ad906ba0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
20:29:58 close(7)                       = 0
20:29:58 write(6, "\1\0\0\0\0\0\0\0", 8) = 8
20:29:58 futex(0x5566ad8e1f70, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 futex(0x5566ad8e1b90, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 futex(0x5566ad8d9058, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/charset.alias", O_RDONLY) = -1 ENOENT (No such file or directory)
20:29:58 write(2, "Failed to register: Timeout was "..., 40) = 40
20:29:58 poll([{fd=4, events=POLLIN}], 1, 0) = 1 ([{fd=4, revents=POLLIN}])
20:29:58 read(4, "\1\0\0\0\0\0\0\0", 16) = 8
20:29:58 futex(0x7f0dccfb72a0, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 poll([{fd=4, events=POLLIN}], 1, 0) = 0 (Timeout)
Run Code Online (Sandbox Code Playgroud)

进一步的 strace 输出在 pastebin 上

  • 同样作为新用户(也很慢):这里
  • 作为 root(不慢):这里

mxm*_*nkn 28

多年来我一直遇到同样的问题,因为我经常有至少一个月的正常运行时间。一段时间后,所有使用系统提供的文件打开对话框的程序似乎都会挂起或等待很多分钟。

pkill gvfsd-trash
Run Code Online (Sandbox Code Playgroud)

应该解决这个问题,所有挂起并等待文件对话框的程序应该在杀死后立即恢复工作gvfsd-trash

另一件需要注意的事情是gvfsd-trash,一段时间后可能会通过caja或任何其他文件浏览器或通过系统文件打开对话框本身重新启动。这不是我遇到的第一个问题gvfsd-trash,我开始怀恨在心,但是,我不想卸载gvfsd,我需要它来通过 MTP 安装 USB 拇指驱动器和我的智能手机。因此,我选择了暴力解决方案,并仅使gvfsd-trash二进制文件不可访问,例如,通过重命名它:

sudo mv /usr/libexec/{gvfsd-trash,.bak}
Run Code Online (Sandbox Code Playgroud)

它可能位于不同系统上的另一个位置,请尝试询问您的数据包管理器,例如,通过调用:

dpkg -L gvfs-daemons | grep trash
Run Code Online (Sandbox Code Playgroud)

当心其影响。如果没有,gvfsd-trash您将无法trash:///通过文件浏览器访问特殊的 URI 路径!就我个人而言,无论如何我从未使用过它。.Trash您还可以在每个挂载点和您家中存在的文件夹中手动访问已删除的文件,例如:

  • ~/.local/share/Trash
  • /media/mounted-external-harddrive/.Trash

看起来问题是 gvfsd-trash 和 D-Bus 的组合。gvfs bugtracker 中似乎存在一个合适的问题,该问题已被修复,但尚未推广到我的系统中。

多年来,我使用了不同的解决方案,即在新的 DBus 会话中启动每个程序,在最重要的程序(如 Firefox 和文本编辑器)前面加上dbus-launch. 然而,这也带来了一些问题,因为每个会话将产生至少 5 个gvfsd进程以及可能的其他进程,并且 D-Bus 会话不会通过关闭其中打开的程序来关闭,并且 D-Bus 会话总数是有限的,所以一段时间后,您将无法启动程序。

  • 这为我解决了问题 - 很难找到这个问题,感谢您的回答。 (2认同)
  • @sdlins:) 谢谢。这些是 bash [大括号扩展](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html)。它们经常节省我在 shell 中的打字工作。 (2认同)