預讀
- 關于如何使用 skynet 可以參考 wiki 檔案
- 更多實戰內容見 https://www.lanqiao.cn/courses/2770 優惠碼:
2CZ2UA5u
環境測驗搭建
使用示例代碼見 examples/main.lua ,
先開啟行程:
$ ./skynet examples/config
從 examples/main.lua 中可以看到 debug_console 開啟的埠是 8000 :
skynet.newservice("debug_console",8000)
現在我們使用 nc 或者 telnet 命令連接這個埠就能進入除錯控制臺,
$ rlwrap nc 127.0.0.1 8000
Welcome to skynet console
這里推薦使用 rlwarp 命令包裹一下 nc 命令,這樣可以實作輸入命令時使用 ctrl + r 搜索歷史輸入的命令,使用 ctrl + p 和 ctrl + n 可以上下查看歷史命令,
當看到顯示了 Welcome to skynet console 時,說明已經成功連上控制臺了,
查看服務串列
輸入 list 命令,可以看到正在運行中的服務串列,
Welcome to skynet console
list
:01000004 snlua cmaster
:01000005 snlua cslave
:01000007 snlua datacenterd
:01000008 snlua service_mgr
:0100000a snlua protoloader
:0100000b snlua console
:0100000c snlua debug_console 8000
:0100000d snlua simpledb
:0100000e snlua watchdog
:0100000f snlua gate
<CMD OK>
如上所示,:01000004 第一列冒號開頭的是服務的地址,snlua cmaster 是服務啟動引數,比如根據 :0100000c snlua debug_console 8000 可以查到 debug_console 服務的地址為 :0100000c ,
查看幫助
help 命令很有用的,有時候忘記命令的格式了,輸入 help 可以臨時看看,
help
call call address ...
clearcache clear lua code cache
cmem Show C memory info
debug debug address : debug a lua service
dumpheap dumpheap : dump heap profilling
exit exit address : kill a lua service
gc gc : force every lua service do garbage collect
help This help message
info info address : get service infomation
inject inject address luascript.lua
jmem Show jemalloc mem stats
kill kill address : kill service
killtask killtask address threadname : threadname listed by task
list List all the service
log launch a new lua service with log
logoff logoff address
logon logon address
mem mem : show memory status
netstat netstat : show netstat
ping ping address
profactive profactive [on|off] : active/deactive jemalloc heap profilling
service List unique service
signal signal address sig
snax lanuch a new snax service
start lanuch a new lua service
stat Dump all stats
task task address : show service task detail
trace trace address [proto] [on|off]
uniqtask task address : show service unique task detail
call 命令的使用
call 命令是對 skynet.call 介面的封裝,執行效果和 skynet.call 效果一樣,一般用于手動執行服務里的某個函式,且該函式是 command 里的介面,
比如 simpledb 服務,代碼位置: examples/simpledb.lua ,定義了 GET 和 SET 介面:
function command.GET(key)
return db[key]
end
function command.SET(key, value)
local last = db[key]
db[key] = value
return last
end
接下來我們在 debug console 里執行 call 指令查看效果:
call :0100000d "set", "A", 100
n 1
<CMD OK>
call :0100000d "get", "A"
1 100
n 1
<CMD OK>
首先是執行的 set 介面,命令格式為 call 服務地址 "介面名", 引數1, 引數2 ,其中服務地址就是 list 命令顯示出來的地址,介面名需要帶引號,引數如果是字串的時候,也需要有引號,
然后執行的是 get 介面,回傳的資料會輸出到終端,
可能已經發現了為什么定義的介面名是大寫的,我們使用的時候卻可以小寫?這是因為 simpledb 對介面名做了處理,忽略大小寫了,一般服務都沒有處理這個的,所以需要注意保持相同的介面名,
skynet.start(function()
skynet.dispatch("lua", function(session, address, cmd, ...)
cmd = cmd:upper()
if cmd == "PING" then
...
end
local f = command[cmd]
if f then
...
debug 命令
debug 命令就不多解釋了,這篇 《在線除錯 Lua 代碼》 寫很詳細了,也給出了演示示例,
inject 命令
前面看到 call 命令可以執行已經有實作好的外部介面,可是如何執行不是外部介面的函式呢?這就可以用 inject 來執行沒有提供外部介面的函式了,
新建檔案 testinject.lua ,寫入下面代碼:
local skynet = require "skynet"
skynet.error("I'm in inject")
然后在 debug console 里執行 inject :0100000d ./testinject.lua ,如下:
inject :0100000d ./testinject.lua
<CMD OK>
這時, skynet 行程那邊會輸出下面的日志:
[:0100000d] I'm in inject
這里只是測驗了 skynet.error 介面,想執行任意介面都行的, local 函式不是很方便執行的,需要根據 upvalue 去找,比較麻煩,所以一般只用來執行一些模塊的介面,
參考文章
- cloudwu/skynet/wiki/DebugConsole
- 在線除錯 Lua 代碼
- skynet debug console 使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285787.html
標籤:其他
