Como o escape também não funcionou (e ele funciona sem a linha de comando, por que) e eu não queria gastar mais tempo depurando, eu escrevi meu próprio plugin Nagios para substituir check_http, que funciona como um encanto:
Eu tenho este comando definido:
define command{
command_name check_http_sane
command_line $USER1$/check_http -H $HOSTNAME$ -r "HTTP/1.1 (200|301|302|303|304|307|401|418|426)"
}
Quando eu o executo manualmente na linha de comando, ele funciona bem, mas o nagios (2.6) relata um erro "padrão não encontrado". Eu preciso escapar de algo?
Editar: Como dito abaixo, eu resolvi isso substituindo check_http
pelo meu próprio script que funciona (bom o suficiente para o nosso caso de uso, de qualquer forma). Script: link
Como o escape também não funcionou (e ele funciona sem a linha de comando, por que) e eu não queria gastar mais tempo depurando, eu escrevi meu próprio plugin Nagios para substituir check_http, que funciona como um encanto:
O código-fonte para check_http.c diz que a opção -r
verifica os cabeçalhos e o conteúdo da página. O problema que você está vendo é provavelmente o interpretador de macros do comando Nagios tentando substituir algo na sua string regex.
Você deve tentar escapar de todos os seus caracteres (
, |
e )
. Se isso não funcionar, tente apenas os parênteses e apenas os tubos. Você também pode tentar usar aspas simples em vez de aspas duplas.
Sua afirmação de que isso "funciona bem" na linha de comando é questionável. Quando eu o executo manualmente, ele não "funciona bem":
./check_http -H localhost -r "HTTP/1.1 (200|301|302|303|304|307|401|418|426)"
HTTP CRITICAL: HTTP/1.1 302 Found - pattern not found - 650 bytes in 0.001 second response time |time=0.001410s;;;0.000000 size=650B;;;0
Como Jeff Strunk sugere, você precisa escapar dos parênteses (então o shell não os consome), assim:
./check_http -H localhost -r "HTTP/1.1 \(200|301|302|303|304|307|401|418|426\)"
HTTP OK: HTTP/1.1 302 Found - 650 bytes in 0.001 second response time |time=0.001425s;;;0.000000 size=650B;;;0