You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua脚本通过stdin/stdout交互时如何检测父进程退出?

问题根因

父进程退出时,父子进程用于交互的标准输入管道会被操作系统自动关闭,此时io.read()遇到EOF会**直接返回nil不再阻塞,你现有代码未处理EOF场景,导致循环进入空转死循环,占满单核CPU。

解决方案

跨平台无依赖最简方案(推荐)

直接判断io.read()的返回值,检测到EOF直接退出即可,修改后代码如下:

local running = true;
while running do
    print('ready'); io.flush();
    local input = io.read();
    -- 输入为nil代表标准输入已关闭,父进程已退出
    if not input or input == "exit" then
        running = false
    else
        print(DoStuffWithInput(input))
        io.flush() -- 补充输出刷新,避免缓冲导致父进程无法及时收到返回结果
    end
end

该方案不需要引入任何第三方依赖,兼容所有操作系统,是最安全优雅的实现方式。

极端场景补充方案

如果存在父进程未关闭管道但异常挂死的特殊场景,可额外检测父进程存活状态:

  • 类Unix平台可引入luaposix库调用系统接口判断父进程ID:
local posix = require "posix.unistd"
local init_ppid = posix.getppid()
-- 循环内新增判断
if posix.getppid() ~= init_ppid then
    -- 父进程已退出,被系统init进程收养,直接终止脚本
    running = false
end
  • Windows平台可调用win32 api获取父进程存活状态进行判断,该类场景出现概率极低,一般情况使用第一套方案即可满足需求。

内容的提问来源于stack exchange,提问作者user2950509

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:36:05