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

Python iotop脚本无法通过自定义脚本执行工作,python,linux,bash,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/i

我已经安装了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
回溯(最近一次呼叫最后一次):
文件“/usr/bin/iotop”,第9行,在
从iotop.ui导入main
文件“/usr/lib/python2.6/site packages/iotop/ui.py”,第13行,在
从iotop.data import查找UID、TaskStatsNetlink、ProcessList、Stats
文件“/usr/lib/python2.6/site packages/iotop/data.py”,第36行,在
从iotop导入ioprio,vmstat
文件“/usr/lib/python2.6/site packages/iotop/ioprio.py”,第52行,在
__NR\u ioprio\u get=查找ioprio\u系统调用号(ioprio\u get\u ARCH\u系统调用)
文件“/usr/lib/python2.6/site packages/iotop/ioprio.py”,第38行,在
查找系统调用号
bits=platform.architecture()[0]
文件“/usr/lib64/python2.6/platform.py”,第1073行,在体系结构中
输出=_syscmd_文件(可执行文件“”)
文件“/usr/lib64/python2.6/platform.py”,第1021行,在syscmd文件中
rc=f.close()
IOError:[Errno 10]没有子进程

有人能解释一下吗?

通常,当您在自动化命令时遇到问题,这是因为自动运行命令的东西没有定义相同的环境变量(因为没有登录)。不过,我认为这里的情况并非如此。我更愿意怀疑用户脚本正在运行,因为他们没有相同的权限


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

在内部,它调用一个等效的:

import os
import sys

f = os.popen('file -b "%s" 2> %s' % (sys.executable, os.devnull))
f.read()
f.close()
要使
popen()
正常工作,它必须能够获得
SIGCHLD
信号,告诉它子进程已退出。执行
iotop
的环境似乎有一个定制的reaper进程,该进程拦截
SIGCHLD
,并防止python收到进程退出的通知。因此,当函数调用
.close()
时,python试图杀死已经死了的进程,并从操作系统中获取错误

如果您无法重新配置环境以允许
SIGCHLD
通过,我认为您将不得不求助于丑陋的黑客攻击

iotop
包装在一个脚本中,使用一个总是返回相同元组的函数(比如
('64bit',ELF')
)来修补
platform.architecture()


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

更清楚地说明:我认为这里的问题与
iotop
完全无关。您的环境似乎正在阻止os.popen()
工作。