Скрипт iotop не работает через выполнение нестандартного скрипта - PullRequest
2 голосов
/ 26 сентября 2011

У меня установлен CSF (настройка безопасного брандмауэра), у него есть функция, позволяющая вам запускать пользовательские сценарии для событий средней нагрузки.

Мой скрипт:

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

Он отлично работает через оболочку bash, но при выполнении 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 ]

1 голос
/ 26 сентября 2011

Внутренне он вызывает эквивалент:

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')) - для получения результата реальногоarchitecture()) должен позволять вам прогрессировать.

Кроме того, вы можете просто сделать локальную копию файла platform.py и отредактировать ее напрямую, установив PYTHONPATH для задания cron, указывающего на этот новый файл.

0 голосов
/ 26 сентября 2011

Обычно, когда у вас возникают проблемы с автоматизацией команд, это происходит из-за того, что для запуска команды автоматически не определены те же переменные окружения (потому что нет логина).Я не думаю, что это имеет место здесь, хотя.Я бы скорее заподозрил пользователя, что скрипт запущен, поскольку у него нет тех же прав.

Я бы попытался su , чтобы пользователь CSF запускал скрипт как, и попытался запуститьэто вручную как тот пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...