2011-09-26 67 views
2

我已安装CSF(配置安全防火墙),它有一个功能,允许您在平均负载事件上执行自定义脚本。iotop脚本无法通过自定义脚本执行

我的脚本:

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

它可以通过bash shell的很好,但是当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正在运行脚本,并尝试以该用户身份手动运行它。

1

内部调用的等效:

import os 
import sys 

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

对于popen()去解决它必须能够得到SIGCHLD信号,告诉它一个子进程退出。看起来执行iotop的环境有一个自定义的收集器进程,拦截SIGCHLD,并阻止python获得有关退出进程的通知。因此,当函数调用.close()时,python会尝试杀死已经死机的进程并从操作系统中获取错误。

如果你不能重新配置环境让SIGCHLD通过,我认为你会有ro的手段丑陋的黑客攻击。

结束语在脚本猴子补丁platform.architecture()与总是返回相同的元组(像('64bit', 'ELF') - 咨询的实际architecture()输出)功能应该让你进步iotop

或者,您可以制作platform.py文件的本地副本并直接编辑该文件,并设置PYTHONPATH以使cron作业指向该新文件。

+0

为了更清楚:我认为这里的问题与'iotop'完全无关。看来你的环境阻止了'os.popen()'的工作。 – patrys