Lua:如何检查进程是否正在运行

时间:2015-06-04 14:19:32

标签: process lua

我想从Lua启动一个进程并监视进程是否仍在运行。

[编辑] 我知道启动可以通过os:execute来实现,但这是阻塞的。我想找到一种方法来启动一个非阻塞的进程并监视它是否仍在运行。

4 个答案:

答案 0 :(得分:0)

其中一个直截了当的方法就是使用io.popen()并监视它的输出或使用其他Linux工具(如ps)自行处理它们。

另一种方法是使用一些Lua POSIX绑定,如POSIX.signalPOSIX.unistd#fork()

答案 1 :(得分:0)

以下Lua库提供(异步)启动和监视进程的功能。

http://stevedonovan.github.io/winapi/

答案 2 :(得分:0)

如果你正在使用luajit,你可以使用外部函数接口直接调用OS api函数。例如对于Linux或类似的。

local ffi = require("ffi")
local C = ffi.C
ffi.cdef[[
  int fork(void);
  int execlp(const char* file, const char *arg, ...);
  int waitpid(int pid, int *status, int options);
  void _exit(int status);
  unsigned int sleep(unsigned int seconds);
]]

local pid = C.fork()

if pid > 0 then -- parent
  print("Waiting for child process:");
  local status = ffi.new('int[1]')
  local WNOHANG = 1
  local done = false
  while not done do
    local id = C.waitpid(-1, status, WNOHANG)
    if id == pid then
      done = true
    elseif pid < 0 then
      print("error occurred")
      os.exit(-1)
    else
      print("status=",status[0])
      C.sleep(1)
      -- do other stuff. We aren't waiting
    end
  end
  print("Child exited with status=", status[0])
elseif pid == 0 then -- child
  print("Starting child")
  C.execlp('sleep', 'sleep', '5')
  C._exit(-1)   -- exec never returns
elseif pid < 0 then -- failure
  print("failed to fork")
end

你会看到,在WNOHANG = 1的情况下,你仍然可以得到一个结果,看看孩子是否已经退出,然后继续做其他事情。

答案 3 :(得分:-2)

Lua中的协同程序允许您执行所需的操作(因为Lua 5.0):

local function Body()
    print( "First resume" )

    coroutine.yield()

    print( "Second resume" )

    coroutine.yield()

    print( "Final resume" )
end

local co = coroutine.create( Body )

print( type( co ) )  -- prints "thread"

coroutine.resume( co )  -- prints "First resume"

print( "After first yield" )

coroutine.resume( co )  -- prints "Second resume"

print( "After second yield" )

coroutine.resume( co )  -- prints "Final resume"

print( coroutine.status( co ) ) -- "suspended", "dead"