2011-09-26 2 views
2

CSF가 설치되어있어 (안전한 방화벽 구성) 평균 평균 이벤트로드시 사용자 정의 스크립트를 실행할 수 있습니다.iotop 스크립트가 사용자 정의 스크립트 실행을 통해 작동하지 않습니다.

내 스크립트를

##!/usr/bin/env bash 
iotop -bto --iter=1 2>&1 | mail -s "$HOSTNAME iotop output" [email protected] 

그것은 bash 쉘을 통해 잘 작동하지만, LFD (CSF의 모니터링 프로세스)에 의해 실행될 때, 나는 다음과 같은 출력을 얻을 :

Traceback (most recent call last): 
    File "/usr/bin/iotop", line 9, in <module> 
    from iotop.ui import main 
    File "/usr/lib/python2.6/site-packages/iotop/ui.py", line 13, in 
<module> 
    from iotop.data import find_uids, TaskStatsNetlink, ProcessList, Stats 
    File "/usr/lib/python2.6/site-packages/iotop/data.py", line 36, in 
<module> 
    from iotop import ioprio, vmstat 
    File "/usr/lib/python2.6/site-packages/iotop/ioprio.py", line 52, in 
<module> 
    __NR_ioprio_get = find_ioprio_syscall_number(IOPRIO_GET_ARCH_SYSCALL) 
    File "/usr/lib/python2.6/site-packages/iotop/ioprio.py", line 38, in 
find_ioprio_syscall_number 
    bits = platform.architecture()[0] 
    File "/usr/lib64/python2.6/platform.py", line 1073, in architecture 
    output = _syscmd_file(executable, '') 
    File "/usr/lib64/python2.6/platform.py", line 1021, in _syscmd_file 
    rc = f.close() 
IOError: [Errno 10] No child processes 

사람이 어떤 있나를 이것에 불을 붙 였나요?

답변

0

일반적으로 명령을 자동화하는 데 문제가있는 경우 명령이 자동으로 실행되는 것과 동일한 환경 변수가 정의되지 않기 때문에 (로그인이 없기 때문입니다). 나는 그것이 여기의 경우라고 생각하지 않는다. 스크립트가 실행되고있는 사용자에게 동일한 권한이 없는지 곧 의심 할 것입니다.

su CSF가 다음과 같이 스크립트를 실행중인 사용자에게 시도하고 해당 사용자로 수동 실행 해 봅니다. 그것은 자식 프로세스가 종료 있음을 말하는 SIGCHLD 신호를 얻을 수 있어야 일을 popen()를 들어

import os 
import sys 

f = os.popen('file -b "%s" 2> %s' % (sys.executable, os.devnull)) 
f.read() 
f.close() 

:

1

내부적으로는 동등한를 호출합니다. iotop을 실행하는 환경은 SIGCHLD을 가로 채고 프로세스 종료에 대한 알림을 얻지 못하게하는 사용자 지정 리퍼 프로세스가있는 것 같습니다. 따라서 함수가 .close()을 호출하면, 파이썬은 이미 죽은 프로세스를 죽이려고 시도하고 운영 체제에서 오류를 얻습니다.

SIGCHLD을 전달하도록 환경을 다시 구성 할 수 없다면 추악한 해킹에 빠질 것이라고 생각합니다. 항상 같은 튜플 (실제 architecture()의 출력 -consult ('64bit', 'ELF') 같은)을 반환하는 함수와 원숭이 패치 platform.architecture()이 진행하도록해야하는 스크립트에서 iotop 포장

.

또는 platform.py 파일의 로컬 복사본을 만들어 직접 편집 할 수 있습니다. PYTHONPATH을 cron 작업이 해당 새 파일을 가리 키도록 설정하십시오.

+0

더 명확하게하기 : 여기의 문제는 'iotop'과 전혀 관련이 없다고 생각합니다. 환경에 의해'os.popen()'이 동작하지 않는 것 같습니다. – patrys

관련 문제