从Debian9转Ubuntu18.04后Conky脚本报错:Bad file descriptor
write error: Bad file descriptor的问题 我之前也碰到过类似的跨发行版Conky兼容坑,结合你的场景(Debian 9正常运行,换到Ubuntu 18.04 + Conky 1.10.9就出问题),可以从这几个方向逐一排查修复:
1. 调整Conky窗口配置参数
Ubuntu 18.04默认的GNOME桌面环境和Conky的窗口交互逻辑和Debian 9有差异,很容易导致子进程的文件描述符出现异常。你可以修改Conky配置文件里的own_window相关设置试试:
own_window yes own_window_type normal # 也可以尝试override或desktop类型 own_window_argb_visual yes own_window_transparent yes
修改后重启Conky,看看是否能解决问题。
2. 强制处理命令的错误输出
Conky捕获命令输出时,如果子进程的stderr没有被正确处理,就会触发文件描述符错误。你可以把自定义命令的stderr重定向到stdout或者/dev/null,比如:
- 把原本的
exec cat /path/to/your/file改成exec cat /path/to/your/file 2>&1 - 或者更彻底屏蔽错误输出:
exec cat /path/to/your/file 2>/dev/null
这个方法对cut、grep这类可能产生错误输出的命令尤其有效。
3. 检查AppArmor限制
Ubuntu默认会用AppArmor对系统程序做权限管控,Conky可能被限制了某些文件描述符操作。可以临时禁用Conky的AppArmor规则测试:
sudo aa-disable /usr/bin/conky
之后重启Conky,如果问题消失,说明是AppArmor的限制导致的,你可以编辑/etc/apparmor.d/usr.bin.conky文件,添加必要的权限规则(比如允许读取你要操作的文件,或者允许子进程正常输出)。
4. 替换exec为execi(或execpi)
Conky的exec和execi在执行命令的方式上有细微差异:execi是间隔指定秒数执行命令,它的子进程文件描述符处理逻辑更稳定。比如把:
exec cat /path/to/your/file
改成:
execi 5 cat /path/to/your/file # 每5秒执行一次,可根据需求调整时间
5. 确认Conky的运行权限
确保你是用普通用户身份启动Conky,和终端里执行命令的用户一致。如果之前用sudo运行过Conky,可能会留下权限异常的缓存文件,试试删除~/.cache/conky/下的文件后再重启Conky。
内容的提问来源于stack exchange,提问作者Benjamin Barrois

