Python iotop脚本无法通过自定义脚本执行工作
我已经安装了CSF(配置安全防火墙),它有一个功能,允许您对负载平均事件执行自定义脚本 我的剧本: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
##!/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()
工作。