2015-06-04 2 views
3

Я хотел бы начать процесс с Lua и проверить, продолжает ли процесс работать.Lua: как проверить, работает ли процесс

[EDIT] Я знаю, что запуск может быть выполнен с помощью os: execute, но это блокировка. Я хотел бы найти способ запустить процесс без блокировки и контролировать, продолжает ли он работать.

ответ

0

Следующая библиотека Lua предоставляет функции (асинхронно) запуска и мониторинга процессов.

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

+0

uf, Вы должны были упомянуть, что он вам нужен специально для Windows :) – Kamiccolo

0

Одним из тупых способов было бы использовать только io.popen() и контролировать его вывод или обрабатывать их самостоятельно, используя какой-либо другой инструмент Linux, такой как ps.

Другой способ использовать некоторые привязок Lua POSIX как POSIX.signal и POSIX.unistd#fork()

-1

Сопрограммы в 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" 
0

Если вы используете LuaJIT вы можете использовать интерфейс внешней функции прямого вызова ОС 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 вы можете получить результат назад, чтобы увидеть, если ребенок вышел, но затем продолжать делать другие вещи.

Смежные вопросы