1. 程式人生 > >Skynet伺服器框架(十二) (debug_console)控制檯管理

Skynet伺服器框架(十二) (debug_console)控制檯管理

在 skynet 框架中提供了一個控制檯服務 debug_console ,用於幫助我們檢視 skynet 的一些執行時資料,而且在需要熱更程式碼的時候也需要藉助控制檯來實現。接下來,我們先看看如何使用控制檯,然後在大致看一遍底層的原始碼實現。

工具準備

由於啟動控制檯服務後,需要藉助 nctelnet 來遠端連線控制檯,所需需要確保機器上已安裝了此類工具,這裡我使用的是 nc 6.40 ,可以先查詢本地是否已安裝了該工具:

$ nc --version
Ncat: Version 6.40 ( http://nmap.org/ncat )

假如未安裝,直接使用 yum 工具進行安裝:

$ yum install nc

啟動服務

在 skynet 的啟動會服務(通常是在 skynet 啟動時,也就是在 config 啟動配置檔案所指定的執行時第一個服務 start = "main" ,即 main.lua)中新增一句程式碼即可啟動控制檯服務:

skynet.newservice("debug_console", 8000)

第二個引數指定了遠端連線的埠號,此埠可以根據自己需要進行修改,在啟動 skynet 服務時看到如下 log 輸出代表控制檯啟動成功:

[:0100000a] LAUNCH snlua debug_console 8000
[:0100000a] Start debug console at 127.0.0.1:8000

然後在新的 shell 視窗中連線控制檯,連線成功如下:

$ nc 127.0.0.1 8000
Welcome to skynet console

官方建議:

出於安全考慮,除錯控制檯只能監聽本地地址 127.0.0.1 ,所以如果需要遠端使用,需要先登入到本機,然後再連線。

安裝使用 telnet 並連線控制檯服務其實也不難:

$ yum install telnet
$ telnet 127.0.0.1:8000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Welcome to skynet console

幫助文件

直接使用 help 指令查詢幫助文件,瞭解所有可用的指令 :

[[email protected]
~]# nc 127.0.0.1 8000
Welcome to skynet console help callcall address ... clearcacheclear lua code cache cmemShow C memory info debugdebug address : debug a lua service exitexit address : kill a lua service gcgc : force every lua service do garbage collect helpThis help message infoinfo address : get service infomation injectinject address luascript.lua killkill address : kill service listList all the service loglaunch a new lua service with log logofflogoff address logonlogon address memmem : show memory status pingping address serviceList unique service shrtblShow shared short string table info signalsignal address sig snaxlanuch a new snax service startlanuch a new lua service statDump all stats tasktask address : show service task detail <CMD OK>

直接在當前 shell 視窗輸入對應的指令並帶上引數即可,官方文件介紹引數格式:

命令的一般格式是 命令 地址 ,有些命令不帶地址,會針對所有的服務。當輸入地址時,可以使用 :01000001 這樣的格式指代一個服務地址:由冒號開頭的 8 位 16 進位制數字,也可以省略前面兩個數字的 harbor id 以及接下來的連續 0 ,比如 :01000001 可以簡寫為 1 。所有活動的服務可以輸入 list 列出。

原始碼解析

服務的 lua 原始碼在 service\debug_console.lua 中,從 skynet.start 方法開始:

skynet.start(function()
local listen_socket = socket.listen (ip, port)
skynet.error("Start debug console at " .. ip .. ":" .. port)
socket.start(listen_socket , function(id, addr)
        -- 返回執行結果給指令請求端
local function print(...)
local t = { ... }
for k,v in ipairs(t) do
t[k] = tostring(v)
end
socket.write(id, table.concat(t,"\t"))
socket.write(id, "\n")
end
socket.start(id)
skynet.fork(console_main_loop, id , print)
end)
end)

這裡啟動了一個 Socket 監聽:

local listen_socket = socket.listen (ip, port)

監聽的 ip 和埠可以在啟動服務時傳入:

local ip = (arg.n == 2 and arg[1] or "127.0.0.1")-- 預設是本地 ip 127.0.0.1 ,或者是傳入兩個引數時的第一個引數
local port = tonumber(arg[arg.n])-- 傳入引數的最後一個

啟動完監聽埠後,啟動一個協程來執行一個死迴圈,用於監控 socket 連線端輸入的命令,並解析執行命令,將結果通過 socket 返回給 socket 連線端:

skynet.fork(console_main_loop, id , print)

命令結果輸出:

此處傳入的最後一個引數 print 是一個 function ,用於向 socket 連線端返回執行指令的列印結果,以文字的形式,這裡可以簡單地理解為:socket 監聽端與連線端的一種聊天模式。

命令輸入:

在協程中的死迴圈用於監聽命令請求端輸入的命令,基本邏輯如下:

pcall(function()
while true do
local cmdline = socket.readline(stdin, "\n")
if not cmdline then
break
end
      -- http 命令資料解析
if cmdline:sub(1,4) == "GET " then
-- http
local code, url = httpd.read_request(sockethelper.readfunc(stdin, cmdline.. "\n"), 8192)
local cmdline = url:sub(2):gsub("/"," ")
docmd(cmdline, print, stdin)
break
end
      -- nc 或 telnet 命令資料解析
if cmdline ~= "" then
docmd(cmdline, print, stdin)
end
end
end)
  • 通過 socket.readline 讀取最新的命令列,沒有新命令則結束本次;

  • 有新命令,則解析命令,這裡接續要區分 nctelnet 傳入的 socket 資料和通過 Http 請求發過來的資料。

docmd 是根據解析結果呼叫具體執行介面的方法:

local function docmd(cmdline, print, fd)
local split = split_cmdline(cmdline)
local command = split[1]
local cmd = COMMAND[command]
local ok, list
if cmd then
ok, list = pcall(cmd, table.unpack(split,2))
else
cmd = COMMANDX[command]
if cmd then
split.fd = fd
split[1] = cmdline
ok, list = pcall(cmd, split)
else
print("Invalid command, type help for command list")
end
end

if ok then
if list then
if type(list) == "string" then
print(list)
else
dump_list(print, list)
end
end
print("<CMD OK>")
else
print(list)
print("<CMD Error>")
end
end

重要介面

  • info address

    檢視指定服務詳情的介面

  • inject inject address

    熱更時常用到的介面

優化控制檯

在 skynet 的 debug_console 中不能使用鍵盤的上下鍵來追溯之前的輸入歷史命令,每次都要重新輸入命令。想優化這個操作,需要使用到 readline 的 history 特性,可以通過安裝 rlwrap 工具來實現。具體的安裝步驟如下:

  • 安裝 readline ,因為 rlwrap 依賴於此工具,在 skynet 編譯的時候也依賴與此工具:

    $ yum -y install readline-devel
  • 安裝 rlwrap ,這是一個開源的工具,原始碼在 Github 上可以找到,最新的版本是 v 0.43 ,可以下載原始碼來進行編譯安裝,但這裡為了節省時間還是建議直接到 這裡 下載安裝包 ,然後解壓安裝:

    $ tar -zxf rlwrap-0.43.tar.gz   
    $ cd rlwrap-0.43  
    $ ./configure -q # -q表示靜默不列印配置日誌 
    $ make && make install

    檢查安裝成功:

    $ rlwrap --version
    rlwrap 0.43

rlwrap 常用的快捷:

Ctrl+L 清屏,實際是將當前行置頂
Ctrl+P 上一條命令
Ctrl+N 下一條命令
Ctrl+U 從游標處刪除到行首
Ctrl+W 向前刪除一個單詞
Ctrl+B 游標向前移動一個位置
Ctrl+T 游標處字元與前一個字元交換位置
Ctrl+Z 後臺執行,使用fg調出
Ctrl+H 相當於刪除鍵
Ctrl+J 相當於回車鍵
Ctrl+O 相當於回車鍵
Ctrl+M 相當於回車鍵

需要在 nc 中使用到 rlwrap 的功能,連線時的指令需要加上 rlwrap 字首,變成:

rlwrap nc 127.0.0.1 8000

不加字首的話,rlwrap 工具是不起作用的。

參考

相關推薦

從零開始搭建前後端分離的NetCore2.2EF Core CodeFirst+Autofac+Vue的專案框架Swagger引數使用

  引言   在 上一篇 中提到了 Swagger 的基本使用,僅限於沒有引數,沒有驗證的那種api文件生成,那麼這篇就連線上篇繼續,在一般具有安全性、許可權等驗證的介面上,   都會在header/url中加上請求者的祕鑰、簽名等,當然也有可能新增到body等其它地方, Swashbuckle.A

Skynet伺服器框架 debug_console控制檯管理

在 skynet 框架中提供了一個控制檯服務 debug_console ,用於幫助我們檢視 skynet 的一些執行時資料,而且在需要熱更程式碼的時候也需要藉助控制檯來實現。接下來,我們先看看如何使用控制檯,然後在大致看一遍底層的原始碼實現。工具準備由於啟動控制檯服務後,需

一起寫框架-Ioc內核容器的實現-對象的調用-@Bean註解註入容器的對象

擴展 lac iter component cts block 根據 spa urn 實現功能 現實需求中,有一些類似無法加入掃描組件註解的。如jdk裏面的類。 那麽框架必須要支持將沒有組件註解標識的類也可以有一個方式註入到容器裏面。 那麽,我們通過類似Spring的@

基於SSH框架的電子新聞系統的設計與實現——論文隨筆

一、基本資訊 標題:基於SSH框架的電子新聞系統的設計與實現 時間:2015-05 出版源:電子科技大學 領域分類:系統架構和設計 二、研究背景 問題定義:新聞資訊採編和釋出的及時性和準確性較差,難以保證新聞的時效性,進而導致新聞資訊難以有效共享、缺乏高效統一控制。此外,隨著高校規模的擴大、高校合併,由

Django框架—— 補充:inclusion_tag、defer、only、choice、事務、建立多對多的第三張表

補充:inclusion_tag、defer、only、choice、事務、建立多對多的第三張表 一、inclusion_tag 1、作用 用於生成HTML片段,是資料由引數傳入而變成動態 2、使用 # 1.app下新建一個模組,templatetags # 2.建立一個py檔案(mytag.py)

Django框架:orm一對一的操作

前面的部落格已經對資料庫的基礎知識有了介紹,對資料庫資料一對多的操作有了瞭解,現在來看看資料庫的一對一操作,非常簡單 資料庫中建立兩張表,一個賬戶表,一個使用者表。一個賬戶對應一個使用者,即一對一關係, ORM資料庫的一對一關係:一個表中的一條資料對應著另外一個

Android Multimedia框架總結CodeC部分之OMXCodec與OMX事件回撥流程

前言:上篇文中分析到AwesomePlayer到OMX服務,曾介紹到,OMX服務主要完成三個任務: NodeInstance列表的管理,NodeInstance的操作, 事件的處理。最後這個事件處理就是今天放大看的內容。要一步一步一Codec,事件傳遞必不可

應用程式框架實戰:公共操作類開發技巧初學者必讀

  本文專門為初學者而寫,因為很多初學者可能還不瞭解公共操作類的作用和封裝技巧,大部分有經驗的程式設計師都會把自己所碰到的技術問題整理封裝成類,這就是公共操作類。公共操作類往往具有一些通用性,也可能專門解決某些棘手問題。公共操作類是應用程式框架的核心,主要目標是解決大部分技術問題。我將在本文介紹封裝公共操作類

Java高併發程式設計:Executor框架

Java中的執行緒既是工作單元,也是執行單元。工作單元包括Runnable和Callable,而執行單元是由Executor框架支援。 1. Executor框架簡介 1.1 Executor框架的兩級排程模型 在HotSpot VM的執行緒模型中,Java執行緒(java.la

Python爬蟲從入門到放棄之 Scrapy框架的架構和原理

執行 持久 pip 下載 響應 .py example 數據模型 特殊 原文地址https://www.cnblogs.com/zhaof/p/7173397.html 這一篇文章主要是為了對scrapy框架的工作流程以及各個組件功能的介紹 Scrapy目前已經可以很好的在

封裝框架模板引擎

每個框架都有一個模板引擎,我們也去下載一個,到composer.json 在"require"里加入 "duncan3dc/blade": "*", 然後執行composer update 這裡我們下載了一個blade模板引擎 下載好之後我們就可以呼叫了 在core

FFmpeg總結用ffmpeg與nginx實現直播多路流並發播放

xxx 開源 conf ref itl rect arc med rtm 圖:撒哈拉沙漠 下載 nginx 和 nginx-rtmp源碼: http://nginx.org/download/nginx-1.5.10.tar.gz https://github.com/a

Hibernate中的多表操作1:單向多對一

art 保存 int gen round t對象 情況 映射文件 拋出異常 由“多”方可知“一”方的信息,比如多個員工使用同一棟公寓,員工可以知道公寓的信息,而公寓無法知道員工的信息。 案例一: pojo類 public class Department {

黑盒測試用例設計-用例維護

叠代 測試的 部分 開發 用例設計 來源 nbsp 延伸 不同的 六、用例維護—經驗用例 當進入執行測試階段時, 我們總是能發現一些缺陷的出現是出乎我們意料的, 或者說是已有的測試需求和測試用例未能覆蓋的。那麽,對於這部分缺陷,也應當在分析整理後添加到測試需求

從零開始學習htmlCSS布局模型——下

位操作 女生 margin 沒有 定位元素 top 並且 變化 開始 五、什麽是層模型? 什麽是層布局模型?層布局模型就像是圖像軟件PhotoShop中非常流行的圖層編輯功能一樣, 每個圖層能夠精確定位操作,但在網頁設計領域,由於網頁大小的活動性,層布局沒能受到熱捧。 但是

學習MVC之租房網站-緩存和靜態頁面

.html 控制臺 ron 在線教育 適合 取代 system caching 租房網站 在上一篇<學習MVC之租房網站(十一)-定時任務和雲存儲>學習了Quartz的使用、發郵件,並將通過UEditor上傳的圖片保存到雲存儲。在項目的最後,再學習優化網站性能的

自然語言交流系統 phxnet團隊 創新實訓 個人博客

ren texture left 紋理貼圖 技術分享 sse material asset 結果 在本項目中關於天空盒子的使用的配置方法: 給場景添加天空盒 第二種方式 在菜單欄中選擇:Edit->Render Setting,在保證不在選擇場景中其它文

ROS探索總結——坐標系統

時間 形象 ins left 添加 href node continue 我們 ubuntu 14.04 indigo版本 轉摘自:http://www.guyuehome.com/265 一、tf簡介 1、安裝turtle包 1 rosdep install tu

java基礎

pub () 註釋 href 調用 作用 代碼 一個 for循環 java基礎(十二章) 一、變量的作用域(有效的使用範圍) 1、變量有2種 1.1成員變量(屬性) 聲明在類的裏面,方法的外面 1.2 局部變量

學習MeteoInfo次開發教程

odi 資源 level 無法訪問 .cn oid pub images bsp 1.添加新的Form窗體: 在解決方案資源管理器中,右鍵MeteoInfoDemo,“添加”,“Windows 窗體” 2.新窗體中添加好layersLegend1和Layout之後,要把la