使用示例代码见 examples/main.lua

先开启进程:

  1. $ ./skynet examples/config

examples/main.lua 中可以看到 debug_console 开启的端口是 8000 :

  1. skynet.newservice("debug_console",8000)

现在我们使用 nc 或者 telnet 命令连接这个端口就能进入调试控制台。

  1. $ rlwrap nc 127.0.0.1 8000
  2. Welcome to skynet console

这里推荐使用 rlwarp 命令包裹一下 nc 命令,这样可以实现输入命令时使用 ctrl + r 搜索历史输入的命令,使用 ctrl + pctrl + n 可以上下查看历史命令。

当看到显示了 Welcome to skynet console 时,说明已经成功连上控制台了。

输入 list 命令,可以看到正在运行中的服务列表。

  1. Welcome to skynet console
  2. list
  3. :01000004 snlua cmaster
  4. :01000005 snlua cslave
  5. :01000007 snlua datacenterd
  6. :01000008 snlua service_mgr
  7. :0100000a snlua protoloader
  8. :0100000b snlua console
  9. :0100000c snlua debug_console 8000
  10. :0100000d snlua simpledb
  11. :0100000e snlua watchdog
  12. :0100000f snlua gate
  13. <CMD OK>

如上所示,:01000004 第一列冒号开头的是服务的地址,snlua cmaster 是服务启动参数。比如根据 :0100000c snlua debug_console 8000 可以查到 debug_console 服务的地址为 :0100000c

help 命令很有用的,有时候忘记命令的格式了,输入 help 可以临时看看。

  1. help
  2. call call address ...
  3. clearcache clear lua code cache
  4. cmem Show C memory info
  5. debug debug address : debug a lua service
  6. dumpheap dumpheap : dump heap profilling
  7. exit exit address : kill a lua service
  8. gc gc : force every lua service do garbage collect
  9. help This help message
  10. info info address : get service infomation
  11. inject inject address luascript.lua
  12. jmem Show jemalloc mem stats
  13. kill kill address : kill service
  14. killtask killtask address threadname : threadname listed by task
  15. list List all the service
  16. log launch a new lua service with log
  17. logoff logoff address
  18. logon logon address
  19. mem mem : show memory status
  20. netstat netstat : show netstat
  21. ping ping address
  22. profactive profactive [on|off] : active/deactive jemalloc heap profilling
  23. service List unique service
  24. signal signal address sig
  25. snax lanuch a new snax service
  26. start lanuch a new lua service
  27. stat Dump all stats
  28. task task address : show service task detail
  29. trace trace address [proto] [on|off]
  30. uniqtask task address : show service unique task detail

call 命令是对 skynet.call 接口的封装,执行效果和 skynet.call 效果一样,一般用于手动执行服务里的某个函数,且该函数是 command 里的接口。

比如 simpledb 服务,代码位置: examples/simpledb.lua ,定义了 GETSET 接口:

  1. function command.GET(key)
  2. return db[key]
  3. end
  4. function command.SET(key, value)
  5. local last = db[key]
  6. db[key] = value
  7. return last
  8. end

接下来我们在 debug console 里执行 call 指令查看效果:

  1. call :0100000d "set", "A", 100
  2. n 1
  3. <CMD OK>
  4. call :0100000d "get", "A"
  5. 1 100
  6. n 1
  7. <CMD OK>

首先是执行的 set 接口,命令格式为 call 服务地址 "接口名", 参数1, 参数2 。其中服务地址就是 list 命令显示出来的地址,接口名需要带引号,参数如果是字符串的时候,也需要有引号。

然后执行的是 get 接口,返回的数据会输出到终端。

可能已经发现了为什么定义的接口名是大写的,我们使用的时候却可以小写?这是因为 simpledb 对接口名做了处理,忽略大小写了。一般服务都没有处理这个的,所以需要注意保持相同的接口名。

  1. skynet.start(function()
  2. skynet.dispatch("lua", function(session, address, cmd, ...)
  3. cmd = cmd:upper()
  4. if cmd == "PING" then
  5. ...
  6. end
  7. local f = command[cmd]
  8. if f then
  9. ...

debug 命令就不多解释了,这篇 《在线调试 Lua 代码》 写很详细了,也给出了演示示例。

前面看到 call 命令可以执行已经有实现好的外部接口,可是如何执行不是外部接口的函数呢?这就可以用 inject 来执行没有提供外部接口的函数了。

新建文件 testinject.lua ,写入下面代码:

  1. local skynet = require "skynet"
  2. skynet.error("I'm in inject")

然后在 debug console 里执行 inject :0100000d ./testinject.lua ,如下:

  1. inject :0100000d ./testinject.lua
  2. <CMD OK>

这时, skynet 进程那边会输出下面的日志:

  1. [:0100000d] I'm in inject

这里只是测试了 skynet.error 接口,想执行任意接口都行的。 local 函数不是很方便执行的,需要根据 upvalue 去找,比较麻烦。所以一般只用来执行一些模块的接口。

版权声明:本文为hanxi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hanxi/p/14846365.html