gpt4 book ai didi

sockets - os.execute 不继承父级的 fds

转载 作者:行者123 更新时间:2023-12-04 18:15:14 26 4
gpt4 key购买 nike

我有一个类似于这里描述的问题:
Prevent fork() from copying sockets

基本上,在我的 Lua 脚本中,我生成了另一个脚本:

  • 不需要以任何方式与我的脚本通信
  • 我的脚本完成后继续运行
  • 是第 3 方程序,我无法控制其代码

  • 问题是我的 Lua 脚本打开了一个 TCP 套接字来监听特定端口,并在它退出后 尽管 一个明确的 server:close() child (或更具体地说是它的 child )持有套接字并保持端口打开(处于 LISTEN 状态)防止我的脚本再次运行。

    这是演示问题的示例代码:
    require('socket')

    print('listening')
    s = socket.bind("*", 9999)
    s:settimeout(1)

    while true do
    print('accepting connection')
    local c = s:accept()
    if c then
    c:settimeout(1)
    local rec = c:receive()
    print('received ' .. rec)
    c:close()
    if rec == "quit" then break end
    if rec == "exec" then
    print('running ping in background')
    os.execute('sleep 10s &')
    break
    end
    end
    end
    print('closing server')
    s:close()

    如果我运行上面的脚本和 echo quit | nc localhost 9999一切正常 - 程序退出并关闭端口。

    但是,如果我这样做 echo exec | nc localhost 9999程序退出,但端口被生成的 sleep 阻塞(由 netstat -lpn 确认)直到它退出。

    我如何以最简单的方式解决这个问题,最好不要添加任何额外的依赖项。

    最佳答案

    我找到了一个更简单的解决方案,它利用了 os.execute(cmd) 的事实。运行 cmdshell ,事实证明,它能够关闭文件描述符,如下所示:

  • http://linux.die.net/man/1/ash (部分重定向)
  • http://www.gnu.org/software/bash/manual/bashref.html#Redirections


  • 例如(在 ash 中测试):
        exec 3<&-                                      # closes fd3
    exec 3<&- 4<&- # closes fd3 and fd4
    eval exec `seq 1 255 | sed -e 's/.*/&<\&-/'` # closes all file descriptors

    所以在我的 luasocket基于示例足以替换:
        os.execute('sleep 10s &')

    和:
        os.execute("eval exec `seq 1 255 | sed -e 's/.*/&<\\&-/'`; sleep 10s &")

    这会在执行实际命令(此处为 sleep 10s )之前关闭所有文件描述符,包括我的服务器套接字,以便在我的脚本退出后不会占用端口。还有照顾 stdout的加分项和 stderr重定向。

    这比在 Lua 周围工作要紧凑和简单得多。的限制并且不需要任何额外的依赖项。感谢#uclibc,在那里我从嵌入式 linux 工作人员那里获得了有关最终 shell 语法的一些出色帮助。

    关于sockets - os.execute 不继承父级的 fds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4835608/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com