У меня есть lua-блок в конфигурации nginx, который проверяет соединение redis-server и если 4 java-процесса вставлены, а затем возвращает 200 или 500 состояний соответственно этим проверкам.Странное поведение io.popen в lua
location = /healthcheck {
content_by_lua_block {
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.status = 500
return
end
local ps = io.popen("/bin/ps aux |grep -c '[j]ava.*63'")
local output = tostring(ps:read('*a'))
ps:close()
if string.match(output, '4') then
ngx.status = 200
else
ngx.status = 500
end
}
}
Но периодически output
переменная принимает nil
значение, в то время как он не должен. Просто невозможно понять, почему это происходит.
Заранее благодарите, товарищи.
UPD:
Использование tonumber
терпит неудачу на
bad argument #2 to 'tonumber' (number expected, got string)
Изменено расположение конфигурации:
location = /healthcheck {
content_by_lua_block {
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.status = 500
return
end
local ps = io.popen("/bin/ps aux |grep -c '[j]ava.*63'")
local output = tonumber(ps:read())
ps:close()
if (output == 4) then
ngx.status = 200
else
ngx.status = 500
end
}
}
UPD2:
Logging ошибки Nginx (с ToString) печатает следующий:
grep: write error: Broken pipe
2016/04/19 17:54:48 [error] 301#0: *5 [lua] content_by_lua(healthcheck.conf:33):20: OUTPUT:nil
UPD3:
С помощью команды grep -c '[j]ava.*63' <(/bin/ps aux)
, чтобы избежать использования трубы:
local ps = io.popen("grep -c '[j]ava.*63' <(/bin/ps aux)")
получаю следующую ошибку :
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `grep -c '[j]ava.*63' <(/bin/ps aux)'
является то ноль или «ноль»? – Piglet
Я тестировал его, печатая переменную в журнале nginx, и, насколько я помню, не было никаких двойных кавычек. –
возвращает ли строка ниль или значение nil? Почему вы используете tostring в любом случае? read уже возвращает строку – Piglet