文件存在却报错: no such file or directory ,记录下调试过程
前段时间遇见了一个奇怪的问题,在执行二进制文件 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 问题
看见 GPT 直接关掉。😓
linux 下,如果确认文件存在,基本都是位数导致的,linux 下这个提示很脑瘫。
file 下它,还有 ldd 它看看
文件是不是你代码创建的?如果是 有没有可能是并发问题,多个线程访问同一个文件?上一个线程刚删除了 下一个线程又来读了。
这个提示确实很迷惑,不过也是因为底层 execve 返回的错误就这样,说的是找不到 ELF 链接器 文件
起始这个问题,应该是 strace 看调用,才能排查到。。
哈哈,是我的错,没说清,这里查到原因了的,在博客有写的。
怕不是对 ChatGPT 有啥误解吧,建议你多用用
之前在 chroot 下跑 golang 程序也遇到了相同问题 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 execveIf 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.
对,完全一样的问题,第一次遇见比较懵
#8 谢谢建议,不用。
前段时间遇到过这个问题,仔细分析了下,是跟 linux 动态链接器有关,关于动态链接器我博客里翻译了一篇挺好的文章: 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 文件
我看了 的言论和你的博客,我觉得他说的对
嗯,希望有一天你不会觉得自己曾经错了
对,看了你的文章,讲的不错啊。
那就让时间来让你回心转意
那不至于贵 GPT 并没有提供超出搜索引擎额外的信息量选 GPT 而不选搜索引擎,其实只是你为了满足自己“用上新鲜玩意”的虚荣心罢了对最终结果没什么影响
说白了是 ENOENT 翻译成错误信息的时候不完善。
说真的,我真不屑于在这跟你辩论这个。
嗯嗯,是的
#17 虚荣心。。真无语,多用用吧
贵 GPT 并没有提供超出搜索引擎额外的信息量GPT 确实没有添加额外的知识量,但可以减小我检索知识的成本...
我曾经碰到过类似的报错明明可执行文件存在,权限也正确,但在高级语言环境里面调用执行的时候就报cannot execute binary file一搜,都是说什么 32 位、64 位问题最后看了一堆,突然扫到别人写的/bin/sh -c ,才突然意识到自己错哪里了为了在非交互式 shell 里面加环境,都加了/bin/sh 等去加载环境、和长命令行处理然后错就错在/bin/sh -c 写成了/bin/sh -C (受 windows 兼容性 cmd /C ,一不注意写到 linux 的分支里也写了大写的-C )
你这个确实更加隐蔽,不好排查。
根据你和网友的反馈,我是这样认为的。提示 no such file or directory: ./protoc ,你是使用什么工具执行去执行这个 protoc 的,自己的 shell ,或者 crontab ,或者是服务程序,或者是 webserver 里的一个点击,等等,这个很关键,因为你是使用了相对路径点撇./,这样执行一个程序是很省事,但是有隐患的,你使用了相对路径,相对谁呢?你在 shell 里,当然是相对于当前你运行的那个窗口的 shell ,其它的执行环境就不一定了。你在你当前 shell 窗口下执行正确(排除 32 位和 64 位和链接库的问题),那就看可能是执行环境的问题了
只给出一个答案,但不一定是正确那个。你看 GPT 的话就断绝了获得更全面知识的可能性了,虽然省了时间
谁说 GPT 只给一个答案了? 另外,用 GPT 学习效率比搜索引擎快很多,获得知识也更全面的
已知的有 rancher ,不知道大家在使用过程中有没有遇到什么坑? 还有其他工具推荐么? 我们自己的就是 rancher 生产 测试分开 用一个 habor 其实应该分开不…
不引战~第一眼见到 nuejs ,兄弟们这个我是真喜欢!!!简单、实用、无心智负担。这才是能让人快乐的前端轮子。Release 了,虽然还有点嫩,但是相信离生态丰富不远了,推流…
有时候不在家想有个远程桌面用,这样在公共电脑上不用装软件登录啥的。 用途就是看看微信,WPS 编辑文档,访问访问网页,用什么样的系统可以最小化资源?毕竟虚拟机要 24 小时开启…