背景
最近收拾东西,从一堆杂物里翻出来尘封四年多的树莓派 3B 主机来,打扫打扫灰尘,接上电源,居然还能通过之前设置好的 VNC 连上。欣慰之余,开始 clone 我的 git 项目,为它们拓展一个新的平台。在执行 cnblogs 项目 (参考《博客园排名预测 》) 对应的绘图命令时,趋势图、预测图是生成了,但没有自动打开图片,这个问题经过一番探索居然解决了,这篇文章就来分享一下解决问题的过程。
问题
第一眼看到的错误信息:
代码语言:javascript复制$ open ./fit.png
无法获取指向控制台的文件描述符
这里我设置了控制台 locale 为中文,如果是英文的话,得到下面的结果:
代码语言:javascript复制Couldn't get a file descriptor referring to the console
果断在网上搜索了这个错误,得到的结果比较少,根据解决方案主要分以下几种:
- setfont 命令:
- fedora - 错误:无法获得指向控制台的文件描述符
- Error in linux console : Couldn't get a file descriptor referring to the console
- loadkeys 命令:
- loadkeys says “Couldn't get a file descriptor referring to the console” in chroot on ChromeOS
这里我并没有调用 setfont 或 loadkeys 命令,直接执行它俩也会报一样的错误,难道需要在登录脚本里执行一下?抱着试试看的态度,我在 ~/.bashrc 中加了这么一句:
代码语言:javascript复制loadkeys
重启树莓派,这回用 ssh 登录,结果一上来就报错:
代码语言:javascript复制The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 8 23:07:46 2021 from 192.168.1.118
无法获取指向控制台的文件描述符
看来网上的说法和我遇到的不一样,只能自己探索了。好在遇事不决、量子力学,哦 no,strace,看看底层调用哪个环节出问题了:
代码语言:javascript复制$ strace open ./fit.png
execve("/bin/open", ["open", "fit.png"], [/* 36 vars */]) = 0
brk(0) = 0x822000
uname({sys="Linux", node="raspberrypi", ...}) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f91000
access("/etc/ld.so.preload", R_OK) = 0
open("/etc/ld.so.preload", O_RDONLY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=42, ...}) = 0
mmap2(NULL, 42, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0x76f90000
close(3) = 0
open("/usr/lib/arm-linux-gnueabihf/libarmmem.so", O_RDONLY|O_CLOEXEC) = 3
read(3, "177ELF111 3 ( 1 h5 004 "..., 512) = 512
lseek(3, 17960, SEEK_SET) = 17960
read(3, "