2017-07-01 99 views
0

我想編寫lua守護進程,它偵聽TCP套接字並允許處理一些用戶數據。 我正在使用copas庫讓我的服務器同時處理多個客戶端,但不知道如何守護這個服務器。看起來copas不提供這樣的功能。有人知道如何在Lua中創建守護進程嗎?在Lua中編寫一個守護進程

下面是部分代碼,我定義我的服務器:提前

function handler(c, host, port) 
    local peer = host .. ":" .. port 
    print("connection from ", peer) 
    while 1 do 
     command = c:receive"*l" 
     c:send(router(command)) 
    end 
end 


copas.addserver(assert(socket.bind("127.0.0.1", 8888)), 
         function(c) return handler(copas.wrap(c), c:getpeername()) end 
) 


copas.loop() 

謝謝!

+0

你認爲沒有在代碼中被妖魔化嗎?這取決於你想運行哪臺機器,但是比如systemd喜歡不自行妖魔化的進程。即使使用其他init系統/操作系統,您也可以使用Unix守護進程(http://www.libslack.org/daemon/)等工具將進程轉換爲守護進程。 – catwell

回答

1

看看這兩個模塊,他們可以做任何你想要什麼(是的,我們使用它們正是出於這個):

https://github.com/arcapos/luaunix https://github.com/arcapos/luanet

+0

謝謝。我沒有使用你的模塊,但感謝你的回答,我意識到了方向:)爲了解決我的任務,我使用了lua-posix庫。 在結束我的代碼如下: '本地POSIX =要求( 「POSIX」)'' PID = posix.fork()'' 如果PID == 0 then' '\t循環= copas.loop()' 'else' '\t os.exit()' 'end' –

0

感謝響應。我用lua-posix庫做了它,結果比我想象的要容易。現在它看起來像:

local posix = require("posix") 

--some code here 

pid = posix.fork() 
if pid == 0 then 
    print("PID: " .. posix.getpid('pid')) 
    loop = copas.loop() 
else 
    os.exit() 
end 

P.S.我意識到這是非常簡單的解決方案,可能僅作爲示例使用。

+0

我沒有在Lua中使用fork,但是根據其他地方的經驗,您可能需要雙叉。父叉,子叉,孫子是守護神,小孩出口(0),父母等小孩然後出口(0)。這使得孫子完全脫離了終端,這就是你想要的一個守護進程。 https://stackoverflow.com/a/16317668/1695906 –