Nginx:在找不到特定文件时执行带有参数的 Shell 脚本

我想在找不到特定文件(404)时执行带有参数的 Shell 脚本。

作为起点,我使用了以下片段:

location ~* ^/(?<bz2file>.+\.bz2)$ {
  log_by_lua_block {
    os.execute("/usr/local/bin/script")
  }
}

但是我不知道如何在文件不存在时仅运行此脚本。

据我所知,os.execute 也不允许使用参数?

点赞
用户7652095
用户7652095

你可以尝试以只读形式打开文件,如果 io 对象不为 nil 且存在,那就意味着文件存在。(但要记得释放该对象,否则该文件将一直由 Lua 持有,直到程序运行完毕)。

os.execute 在 shell 中调用给定的命令,该函数本身没有任何额外的参数。但是,你可以通过执行命令的单个字符串传递命令行参数,就像使用终端应用程序执行命令一样。在下面的示例中,运行带参数的 os.execute

os.execute("echo hello world")
os.execute("command arg1 arg2 arg3")

要在纯 Lua 中实现你的目标,不需要任何额外的库,你可以使用以下代码:

local f = io.open("/usr/local/bin/script", "r") -- 以只读方式打开文件。
-- IO 对象是否有效?
if f ~= nil then
    -- 如果文件存在,则有效,所以我们需要在执行之前释放它。
    io.close(f)

    -- 使用我们的参数执行。
    os.execute("/usr/local/bin/script arg1 arg2 arg3")
end
2020-05-14 16:50:02