Ubuntu Studio 16.04,联想笔记本电脑。
有时当我从 (1) 主应用程序菜单、(2) 右键单击文件(“打开方式...”)或 (3) 命令行启动应用程序时,应用程序挂起。(挂起的应用程序有:Firefox、Thunderbird、LibreOffice。)
查看进程树后,我发现在所有情况下,请求的应用程序都生成了一个子进程。例如:
~$ ps aux | grep thunderbird
jga 7420 2.2 2.5 618832 99864 ? Sl 22:24 0:00 /usr/lib/thunderbird/thunderbird
jga 7424 0.1 0.7 378240 31344 ? S 22:24 0:00 /usr/lib/thunderbird/thunderbird
jga 7452 0.0 0.0 14224 928 pts/1 S+ 22:24 0:00 grep thunderbird
(并且 pstree 确认了 7420 和 7424 之间的父子关系。)
如果我终止子进程,父进程就会正常启动。
这是 Libre Office 所做的事情。
~$ libreoffice --calc &
[2] 7792
[1] Done libreoffice --calc
~$ #hanging...
~$ ps aux | grep office
jga 7792 0.1 0.1 207860 5764 pts/1 Sl 22:52 0:00 /usr/lib/libreoffice/program/oosplash --calc
jga 7809 0.4 1.4 607036 58752 pts/1 Sl 22:52 0:00 /usr/lib/libreoffice/program/soffice.bin --calc --splash-pipe=5
jga 7810 0.0 0.6 406804 24200 pts/1 S 22:52 0:00 /usr/lib/libreoffice/program/soffice.bin --calc --splash-pipe=5
jga 7815 0.0 0.0 14224 1028 pts/1 S+ 22:53 0:00 grep office
~$ kill -9 7810
~$ # Spreadsheet comes up.
但是,如果我在前台启动该进程-就不会挂起。
那么到底发生了什么?我最近对系统所做的唯一修改是将注释添加到面板中,但后来我又将其删除了。
使用工具箱,我在 Firefox 和 libreoffice 上运行了 strace。例如strace -ff -o /tmp/loffice libreoffice --calc
在这两种情况下,挂起的子进程都有以下共同特征:
- 打开 /etc/drirc 进行读取
- 检查 ~/.drirc 是否存在(不存在)
系统调用写入某个句柄,但最终挂起,例如
ioctl(5, DRM_IOCTL_I915_GEM_CREATE, 0x7ffd90290680) = 0 ioctl(5, _IOC(_IOC_READ|_IOC_WRITE, 0x64, 0x5e, 0x28), 0x7ffd90290630) = 0 ioctl(5, DRM_IOCTL_I915_GEM_SET_DOMAIN, 0x7ffd90290630) = 0 ioctl(5, DRM_IOCTL_I915_GEM_SET_DOMAIN <unfinished ...>
快速访问 Goog 后我发现 drirc 与渲染相关,并且我想起我短暂安装 Notes Panel 应用程序时第一次在安装中看到半透明窗口。
那么,有关系吗?发生了什么事?