我已经安装了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有谁能解释一下这件事吗?
发布于 2011-09-27 02:50:04
在内部,它调用等价物:
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')-consult,real architecture()的输出),应该会让您有所进步。
或者,您可以只制作platform.py文件的本地副本并直接对其进行编辑,将cron作业的PYTHONPATH设置为指向该新文件。
发布于 2011-09-27 02:49:29
通常,当您在自动化命令时遇到问题,这是因为自动运行命令的东西没有定义相同的环境变量(因为没有登录)。不过,我认为这里不是这样的。我很快就会怀疑用户脚本正在运行,因为它没有相同的权限。
我会尝试将su切换到运行脚本的用户CSF,并尝试以该用户的身份手动运行脚本。
https://stackoverflow.com/questions/7559420
复制相似问题