我安装了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
任何人都可以对此有所了解吗?
答案 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运行脚本,并尝试以该用户身份手动运行。