前段时间遇见了一个奇怪的问题,在执行二进制文件 protoc 的时候,报错 no such file or directory: ./protoc 。文件明明就在那里,可是一直报这个错,莫不是系统有 bug 了?
这里的二进制文件真实存在,检查权限也是对的,偏偏执行报错。第一次遇见这种问题,一时间都没有啥排查思路,这看起来就是根本不会发生的事。
大家可以先猜猜可能有哪些原因,以及如何验证?
在有 ChatGPT 之前,遇见解决不了的问题,就先去搜索引擎看看,搜索 no such file or directory but file exist ,有不少结果。这里第一个结果 No such file or directory? But the file exists! 比较匹配我的问题,在问题的高赞回答中,上来就给出了结论:可能是因为在不支持 32 位环境的 64 位机器中运行一个 32 位的二进制。具体到我的这个二进制文件,确实是从一个老的机器上拷到 64 位机器执行的。
不过为啥这样就报错?怎么知道是这个原因的? ChatGPT 在排查问题中究竟能发挥多大的作用?
完整内容在文章 ChatGPT 协助分析诡异的 no such file 问题
1
kkk9 2023-11-13 10:28:18 +08:00 6
看见 GPT 直接关掉。😓
|
2
lisxour 2023-11-13 10:33:31 +08:00
linux 下,如果确认文件存在,基本都是位数导致的,linux 下这个提示很脑瘫。
|
3
guanzhangzhang 2023-11-13 11:06:57 +08:00
file 下它,还有 ldd 它看看
|
4
alittlehj 2023-11-13 11:32:02 +08:00
文件是不是你代码创建的?如果是 有没有可能是并发问题,多个线程访问同一个文件?上一个线程刚删除了 下一个线程又来读了。
|
5
xuelang OP @lisxour 这个提示确实很迷惑,不过也是因为底层 execve 返回的错误就这样,说的是找不到 ELF 链接器 文件
|
6
xuelang OP @guanzhangzhang 起始这个问题,应该是 strace 看调用,才能排查到。。
|
9
whoisnian 2023-11-13 12:13:11 +08:00 via Android 1
之前在 chroot 下跑 golang 程序也遇到了相同问题
https://whoisnian.com/2023/10/17/%E5%9C%A8-chroot-jail-%E4%B8%AD%E8%BF%90%E8%A1%8CGolang%E7%A8%8B%E5%BA%8F/ man 2 execve If the executable is a dynamically linked ELF executable, the interpreter named in the PT_INTERP segment is used to load the needed shared objects. This interpreter is typically /lib/ld-linux.so.2 for binaries linked with glibc (see ld-linux.so(8)). ENOENT The file pathname or a script or ELF interpreter does not exist. |
12
listenerri 2023-11-13 13:52:39 +08:00 2
前段时间遇到过这个问题,仔细分析了下,是跟 linux 动态链接器有关,关于动态链接器我博客里翻译了一篇挺好的文章:
https://listenerri.com/2023/10/08/ld-so-linux-%E5%8A%A8%E6%80%81%E8%BF%9E%E6%8E%A5%E5%99%A8%E6%98%AF%E4%BB%80%E4%B9%88/ 我觉得 linux 报的找不到文件这个错误,并不是指找不到要执行的二进制文件,而是找不到二进制文件依赖的动态链接器 ld...so 文件 |
15
xuelang OP @listenerri 对,看了你的文章,讲的不错啊。
|
17
julyclyde 2023-11-13 14:30:32 +08:00 4
|
18
rrfeng 2023-11-13 14:36:01 +08:00
说白了是 ENOENT 翻译成错误信息的时候不完善。
|
21
sherlockwhite 2023-11-13 15:49:10 +08:00
@julyclyde #17 虚荣心。。真无语,多用用吧
|
22
proxytoworld 2023-11-13 15:55:29 +08:00
|
23
matepi 2023-11-13 16:28:34 +08:00
我曾经碰到过类似的报错
明明可执行文件存在,权限也正确,但在高级语言环境里面调用执行的时候就报 cannot execute binary file 一搜,都是说什么 32 位、64 位问题 最后看了一堆,突然扫到别人写的/bin/sh -c ,才突然意识到自己错哪里了 为了在非交互式 shell 里面加环境,都加了/bin/sh 等去加载环境、和长命令行处理 然后错就错在/bin/sh -c 写成了/bin/sh -C (受 windows 兼容性 cmd /C ,一不注意写到 linux 的分支里也写了大写的-C ) |
25
wangybsyuct 2023-11-13 17:30:41 +08:00
根据你和网友的反馈,我是这样认为的。提示 no such file or directory: ./protoc ,你是使用什么工具执行去执行这个 protoc 的,自己的 shell ,或者 crontab ,或者是服务程序,或者是 webserver 里的一个点击,等等,这个很关键,因为你是使用了相对路径点撇./,这样执行一个程序是很省事,但是有隐患的,你使用了相对路径,相对谁呢?你在 shell 里,当然是相对于当前你运行的那个窗口的 shell ,其它的执行环境就不一定了。你在你当前 shell 窗口下执行正确(排除 32 位和 64 位和链接库的问题),那就看可能是执行环境的问题了
|
26
julyclyde 2023-11-13 18:04:57 +08:00 2
@proxytoworld 只给出一个答案,但不一定是正确那个。你看 GPT 的话就断绝了获得更全面知识的可能性了,虽然省了时间
|
28
kkk9 2023-11-14 15:33:42 +08:00
看了下后来的评论,没什么好争论的,我在 #1 发表的只是我个人意见。我回复的时候并没有点开链接,不过心里大概猜到了。点开看看,果然和猜测的一样,只不过是尬吹 GPT 在解决问题中的“所谓优势”。
我个人看来,GPT 就和英汉字典一样的,有的人一辈子都离不开它,有的人学习阶段使用,后来就再也不用了。取决于什么人,也取决于怎么用。 既然在 GPT 中提问要提炼问题,整理需求,引导它给出自己需要的答案,在没有 GPT 的时代里,你也是这样和搜索引擎对话的,搜索不理想,换个问法。那显然你并不比 GPT 蠢,你还要去验证方案,甚至可能还要和它掰扯(指正?)某些显而易见的错误。 所以,在排查问题中发挥最大作用的就是你本人,你的大脑。用 GPT 并没有减少搜索成本,也没有增加自己的学习效率,甚至损失了在广阔知识中浏览时了解到其他知识的机会。 > OP 原文:自从有了 ChatGPT ,平时遇到问题,第一反应都是拿来问 ChatGPT 。 真正促进学习的仍然是人类自己,不要让自己的大脑萎缩了。如果有一天你的环境里没有 GPT 了,你还能保持学习吗?就像这个时代还剩下多少人坚持写字练字了?拿起笔手抖啊抖的? 很多事情是方便了,可有些真正的本质也就丢了。 提高自己的能力,推荐一本书籍 How To Ask Questions The Smart Way https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way |