#!/opt/lnxall_app/bin/lua local invoker = require "invoker" local module = {} local ZOMBIE_RECHECK_DELAY_MS = 8000 function module.checkplat() return true end function module.category() return "进程状态" end function module.description() return "检查僵尸进程" end function module.detailed() return "扫描系统进程状态, 查找仍然存在的僵尸进程, 用于判断业务或系统服务是否存在进程回收异常." end function module.suggestion() return "请反馈给应用开发" end function module.step() local pids = invoker.glob("/proc/*") if not pids then return { error = "failed to scan /proc" }, true end local zombies = {} for _, pid in ipairs(pids) do if invoker.statfile(pid) == "directory" then local st = invoker.readfile(string.format("%s/status", pid)) if st and string.find(st, "zombie", 1, true) then local zname = invoker.readfile(string.format("%s/comm", pid), invoker.TRIMEND) zombies[#zombies + 1] = { pid = pid:sub(7), name = zname or "unknown", } end end end if #zombies > 0 then local disappeared = 0 invoker.msleep(ZOMBIE_RECHECK_DELAY_MS) for _, zombie in ipairs(zombies) do if not invoker.statfile(string.format("/proc/%s/status", zombie.pid)) then disappeared = disappeared + 1 zombie.valid = false end end if disappeared == #zombies then return {}, false end return zombies, true end return {}, false end return module