openresty 報錯:lua entry thread aborted: runtime error

【1】問題現象nginx

(1)本地openresty系統app

(2)報錯信息函數

2019/09/10 08:13:55 [error] 2385#2385: *4 lua entry thread aborted: runtime error: /usr/local/lib/ubcservd/bin/../work/bill_timer.lua:1647: attempt to concatenate global 'value' (a nil value)lua

(3)分析緣由spa

value變量爲nil值的場景預先沒有考慮到,致使鏈接字符串時失敗。設計

(4)解決(容錯)方案指針

打印value值時,增長nil值的判斷。以下:rest

ngx.log(ngx.ERR, 'todo and print value: ' .. (value or 'nil'))

【2】問題追思日誌

如上異常,出現過"lua entry thread aborted"之後,這個worker process(即id爲2385)到底還存活嗎?code

注意,這裏所謂的存活是相對於C++程序的空指針致使應用程序異常崩潰而言。

模擬場景,分析過程以下:

(1)具體思路:

設計兩個定時器,分別設置不一樣的時間間隔(第一個時間間隔120s短於第二個180s),啓動nginx系統:

當第一個定時器執行異常(如上錯誤)後,觀察第二個定時器是否能夠正常執行。

(2)源碼以下:

[1] 配置文件:

nginx.conf,以下:

worker_processes  3;
user  root;

events 
{
    worker_connections  10000;
}

http 
{

    default_type  application/octet-stream;

    sendfile        on;

    send_timeout 60;
    keepalive_timeout  30;
    
    lua_package_path  "/usr/local/lib/ubcservd/lualib/?.lua;;";

    lua_package_cpath  "/usr/local/lib/ubcservd/lualib/?.so;;";
    
    init_worker_by_lua_file work/bill_timer.lua;

}

[2] 定時器文件:

bill_timer.lua,以下:

    local new_timer = ngx.timer.at

    local function timer_test_one(permature)
        if not premature then
            ngx.log(ngx.ERR, "into timer_test_one print value " .. value)

            local ok, err = new_timer(120, timer_test)
            if not ok then
                ngx.log(ngx.ERR, "failed to create timer_test_one timer : ", err)
            else
                ngx.log(ngx.ERR, "success to create timer_test_one timer interval(s) : " .. '120')
            end
        end
    end

    local function timer_test_two(permature)
        if not premature then
            ngx.log(ngx.ERR, "into timer_test_two print ")

            local ok, err = new_timer(180, timer_test_two)
            if not ok then
                ngx.log(ngx.ERR, "failed to create timer_test_two timer : ", err)
            else
                ngx.log(ngx.ERR, "success to create timer_test_two timer interval(s) : " .. '180')
            end
        end
    end

    if 0 == ngx.worker.id() then
        local ok, err = new_timer(120, timer_test_one)
        if not ok then
            ngx.log(ngx.ERR, "failed to create timer_test_one timer : " .. err)
        else
            ngx.log(ngx.ERR, "success to create timer_test_one timer interval(s) : " .. '120')
        end

        local ok, err = new_timer(180, timer_test_two)
        if not ok then
            ngx.log(ngx.ERR, "failed to create timer_test_two timer : " .. err)
        else
            ngx.log(ngx.ERR, "success to create timer_test_two timer interval(s) : " .. '180')
        end
    end

[3] 啓動nginx系統

成功啓動,建立3個worker process,以下圖:

[4] 日誌分析

第一個定時器執行異常停止錯誤信息,當即觀察worker進程狀況:

進程id值爲2869仍然存在,安然無恙。

第二個定時器執行正常打印信息,全部日誌,以下圖:

綜上所述:「thread aborted」 並不是崩潰,僅僅只是當前函數執行失敗停止,此函數其他語句不會再執行。

 

Good Good Study, Day Day Up.

順序 選擇 循環 總結

相關文章
相關標籤/搜索