【问题标题】:Lua can't import a module and says file not found but the file existsLua无法导入模块并说找不到文件但文件存在
【发布时间】:2021-03-25 00:04:38
【问题描述】:

我正在尝试从导入“pgmoon”库的 haproxy 内部运行一个 lua 脚本。我可以导入 pgmoon 并打开一个套接字,但后来我遇到了这个:

[ALERT] 082/234313 (8) : Lua function 'queue-request': runtime error: /usr/local/share/lua/5.3/pgmoon/init.lua:269: module 'pgmoon.crypto' not found:
no field package.preload['pgmoon.crypto']
no file '/usr/local/share/lua/5.3/pgmoon/crypto.lua'
no file '/usr/local/share/lua/5.3/pgmoon/crypto/init.lua'
no file '/usr/local/lib/lua/5.3/pgmoon/crypto.lua'
no file '/usr/local/lib/lua/5.3/pgmoon/crypto/init.lua'
no file '/usr/share/lua/5.3/pgmoon/crypto.lua'
no file '/usr/share/lua/5.3/pgmoon/crypto/init.lua'
no file './pgmoon/crypto.lua'
no file './pgmoon/crypto/init.lua'
no file '/usr/local/lib/lua/5.3/pgmoon/crypto.so'
no file '/usr/lib/x86_64-linux-gnu/lua/5.3/pgmoon/crypto.so'
no file '/usr/lib/lua/5.3/pgmoon/crypto.so'
no file '/usr/local/lib/lua/5.3/loadall.so'
no file './pgmoon/crypto.so'
no file '/usr/local/lib/lua/5.3/pgmoon.so'
no file '/usr/lib/x86_64-linux-gnu/lua/5.3/pgmoon.so'
no file '/usr/lib/lua/5.3/pgmoon.so'
no file '/usr/local/lib/lua/5.3/loadall.so'
no file './pgmoon.so' from [C] global 'require', /usr/local/share/lua/5.3/pgmoon/init.lua:269 C function line 267 ..., /usr/local/share/lua/5.3/pgmoon/init.lua:211 method 'connect', /usr/local/haproxy/queue-request.lua:38 C function line 25.

然而,在/usr/local/share/lua/5.3/pgmoon/crypto.lua 有一个文件,这是ls 显示的内容:

# ls -la /usr/local/share/lua/5.3/pgmoon/          
total 60
drwxr-xr-x 1 root root  4096 Mar 24 23:42 .
drwxr-xr-x 1 root root  4096 Mar 24 23:00 ..
-rw-r--r-- 1 root root  2880 Mar 24 23:00 arrays.lua
-rw-r--r-- 1 root root  1130 Mar 24 23:00 bit.lua
-rw-r--r-- 1 root root  1587 Mar 24 23:00 cqueues.lua
-rw-r--r-- 1 root root   654 Mar 24 23:00 crypto.lua
-rw-r--r-- 1 root root  2084 Mar 24 23:00 hstore.lua
-rw-r--r-- 1 root root 20127 Mar 24 23:00 init.lua
-rw-r--r-- 1 root root   665 Mar 24 23:00 json.lua
-rw-r--r-- 1 root root  2728 Mar 24 23:42 socket.lua
-rw-r--r-- 1 root root   457 Mar 24 23:00 util.lua

我可以看到它与权限相关,如果 haproxy 用户无法访问根拥有的文件,但是当它到达这里时,它已经执行了 init.lua,它已经导入了 socket.lua 并且他们都得到了一样的权限... 有人知道为什么lua认为crypto.lua没有文件吗?

【问题讨论】:

    标签: lua file-permissions haproxy


    【解决方案1】:

    第一个 init.lua 警报通知您...
    init.lua:269: module 'pgmoon.crypto' not found:
    因此请检查:第 269 行的 init.lua
    它看起来像是 init.lua 中的一个错字。

    【讨论】:

    • 什么样的错字?
    • no field package.preload['pgmoon.crypto'] 让我猜这是一个错字,例如:require('pgmoon.crypto') 会产生它
    • 我知道如何使用package.preload 中的函数传递此错误,该函数返回package.loaded 中的crypto.lua,因此require('pgmoon.crypto') 不会失败 - 但最好在脚本。
    • 为什么require('pgmoon.crypto') 是错字?这是加载库pgmoon/crypto.lua的标准方式
    • 嗯,好的,同意 - 比我看不到任何错误
    【解决方案2】:

    我猜你已经用chroot 配置了haproxy,实际上/usr/local/share/lua/5.3/pgmoon/crypto.lua 没有文件——在你运行haproxy 的chroot 中。

    init.lua 中的 require('pgmoon.crypto') 位于函数内,并且可能会在 Haproxy 和 lua 初始化以及根目录更改之后尝试运行很长时间。

    并且有些(不)相关 - 您可能会期望 pgmoon 不知道 haproxy 的其他问题,例如。它使用 luasocket 而不是 haproxy 提供的替代品:https://www.haproxy.com/blog/5-ways-to-extend-haproxy-with-lua/

    Socket 类是标准 Lua Socket 类的替代品,并且与 HAProxy 的非阻塞特性兼容。当你想在你的动作中使用套接字函数时,你必须使用这个类。

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 2017-03-15
      • 2021-08-27
      • 1970-01-01
      • 2022-06-29
      • 2018-02-06
      • 1970-01-01
      • 2017-05-10
      • 2021-02-01
      相关资源
      最近更新 更多