Como a invocação de python é diferente quando iniciada pelo Nagios nrpe?

1

Quando invocado com python2 após importar os e sys, a seguinte função é executada com sucesso, mas age incorretamente quando invocada pelo Nagios nrpe:

def get_proc1_open_files():

    # Set proc1_children list to empty, then run a system command to get a list of proc1 child processes
    proc1_children = []
    for pids in os.popen("pgrep -P 'ps -ef | grep 'proc1 master' | grep -v grep | head -1 | awk '{print $2}''").readlines():
        proc1_children.append(pids.strip())

    # Build an lsof command using the proc1_children list as the list of pids. Grep out the data files lines
    proc1_lsof = "lsof -p " + ','.join(map(str,proc1_children)) + " | grep -P .*\/[0-9]+\.yaml"

    #Finally, run the lsof and return the number of open files
    proc1_open_files = len(os.popen(proc1_lsof).readlines())
    return proc1_open_files

Ao colocar várias impressões em toda a função e ao anular algumas das funções e executá-las novamente, determinei que tudo funcionasse corretamente quando invocado pelo Nagios nrpe até a seguinte linha:

proc1_open_files = len(os.popen(proc1_lsof).readlines())

Especificamente, descobri que os.popen(proc1_lsof).readlines() não retorna nada por qualquer motivo.

Notas:

  • Assegurei-me de definir o script como um script do python 2
  • Executando no Debian Wheezy
  • O Nagios3 processa com sucesso a saída do script. O valor resultante simplesmente não é o valor correto
  • Este script geralmente retorna um valor no intervalo de 5-25
  • A saída quando executada por um usuário geralmente é algo como "AVISO - 12 arquivos abertos proc1".
  • A saída exata quando executada através do Nagios nrpe é "OK - 0 arquivos abertos proc1". todas as vezes.

Aqui está um link para o script completo: nrpeplugin.py

Eu postei isso na troca de pilha do UNIX em vez do Stack Overflow porque estou principalmente tentando descobrir por que esse pequeno código agiria de forma diferente quando invocado através do Nagios nrpe vs quando ele é chamado diretamente por um usuário. Minhas desculpas se este não for o fórum correto para isso.

    
por MGodby 29.09.2015 / 08:44

1 resposta

1

O problema foi que lsof nesse script estava sendo executado como o usuário nagios.

Foi necessário adicionar a seguinte linha ao / etc / sudoers (ou, opcionalmente, a um novo arquivo em /etc/sudoers.d/):

nagios  ALL=(root) NOPASSWD: /usr/bin/lsof

Além disso, foi necessário alterar a linha 15 do script para conter isso:

    proc1_lsof = "sudo lsof -p " + ','.join(map(str,proc1_children)) + " | grep -P .*\/[0-9]+\.yaml"

O plug-in funciona depois que essas alterações são feitas.

    
por 29.09.2015 / 16:55