2016-04-18 2 views
0

У меня есть 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)' 
+0

является то ноль или «ноль»? – Piglet

+0

Я тестировал его, печатая переменную в журнале nginx, и, насколько я помню, не было никаких двойных кавычек. –

+0

возвращает ли строка ниль или значение nil? Почему вы используете tostring в любом случае? read уже возвращает строку – Piglet

ответ

0

Согласно this ответа и некоторые тестирования следующей конфигурации сделать работу:

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 >/tmp/ps.out", "w") 
     ps:close() 
     local ps = io.popen("grep -c '[j]ava.*63' /tmp/ps.out") 
     local output = tostring(ps:read()) 
     ps:close() 
     if string.match(output, '4') then 
      ngx.status = 200 
     else 
      ngx.status = 500 
     end 

    } 

} 
Смежные вопросы