iotop脚本无法通过自定义脚本执行

时间:2011-09-26 18:19:21

标签: python linux bash

我安装了CSF(配置安全防火墙),它具有允许您在加载平均事件上执行自定义脚本的功能。

我的剧本:

##!/usr/bin/env bash
iotop -bto --iter=1 2>&1 | mail -s "$HOSTNAME iotop output" incidents@

它通过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

任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分: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通过,我认为您将会诉诸丑陋的黑客攻击。

iotop包装在一个脚本中,该脚本使用一个始终返回相同元组的函数来修补platform.architecture()(类似('64bit', 'ELF')的内容 - 请参阅real architecture()的输出)应该让你进步。

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

答案 1 :(得分:0)

通常,当您自动执行命令时出现问题,这是因为自动运行命令的事物没有定义相同的环境变量(因为没有登录)。不过,我认为不是这样的。我很快会怀疑用户脚本正在运行,因为它没有相同的权限。

我会尝试 su 向用户CSF运行脚本,并尝试以该用户身份手动运行。