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
相关产品推荐
相关产品推荐

