Nagios nrpe에서 시작할 때 Python 호출은 어떻게 다릅니까?

Nagios nrpe에서 시작할 때 Python 호출은 어떻게 다릅니까?

다음 함수는 os 및 sys를 가져온 후 python2를 사용하여 호출하면 성공적으로 실행되지만 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

함수 전체에 많은 인쇄물을 배치하고 특정 함수의 중첩을 해제한 후 다시 실행함으로써 Nagios nrpe가 호출되었을 때 다음 줄까지 모든 것이 잘 작동한다고 판단했습니다.

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

특히 os.popen(proc1_lsof).readlines()어떤 이유로든 아무것도 반환되지 않는 것으로 나타났습니다.

노트:

  • 나는 스크립트를 Python 2 스크립트로 정의했는지 확인했습니다.
  • Debian Wheezy에서 실행
  • Nagios3는 스크립트의 출력을 성공적으로 처리했습니다. 결과 값은 단순히 올바른 값이 아닙니다.
  • 스크립트는 일반적으로 5-25 범위의 값을 반환합니다.
  • 사용자가 이를 실행할 때의 출력은 일반적으로 "Warning - 12 proc1 open file"과 같습니다.
  • Nagios nrpe를 통해 실행할 때의 정확한 출력은 "OK - 0 proc1 open files"입니다. 매번.

전체 스크립트에 대한 링크는 다음과 같습니다.nrpeplugin.py

나는 이 코드 조각이 사용자가 직접 호출할 때와 Nagios nrpe를 통해 호출할 때 다르게 동작하는 이유를 주로 파악하려고 하기 때문에 Stack Overflow가 아닌 ​​UNIX Stack Exchange에 이 글을 게시하고 있습니다. 이것이 올바른 포럼이 아니라면 사과드립니다.

답변1

문제는 lsof스크립트가 nagios 사용자로 실행된다는 것입니다.

다음 줄을 /etc/sudoers(또는 선택적으로 /etc/sudoers.d/의 새 파일)에 추가해야 합니다.

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

또한 다음을 포함하도록 스크립트의 15행을 수정해야 합니다.

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

이렇게 변경하고 나면 플러그인을 실행할 준비가 되었습니다.

관련 정보