2014-10-13 3 views
0

У меня есть программа на языке C, которая обрабатывает некоторый входной файл. Я использую скрипт Bash для подачи входных файлов один за другим в эту программу вместе с некоторыми другими параметрами. Каждый входной файл обрабатывается программой 4 раза, каждый раз изменяя некоторые параметры. Вы можете подумать об этом как о эксперименте для тестирования программы C с различными параметрами.Bash: Мониторинг и обработка процессов

Эта программа на C может очень быстро потреблять память (и даже может занимать более 95% памяти ОС, что приводит к замедлению работы системы). Итак, в моем сценарии я контролирую 2 вещи для каждый тест программы - общее время работы и потребляемый процент памяти (полученный от команды top). Когда любой из них первый пересекает пороговое значение, я убиваю программу C, используя killall -q 0 processname, и начинаю следующий тестовый прогон.

Это как структурирован мой сценарий:

# run in background 
./program file_input1 file_input2 param1 param2 & 

# now monitor the process 
# monitor time  
sleep 1 
((seconds++)) 
if [ $seconds -ge $timeout ]; then 
    timedout=1 
    break 
fi 

# monitor memory percentage used 
memused=`top -bn1 | grep \`pidof genpbddh2\` | awk '{print $10}' | cut -d'.' -f1` 

if [ $memused -ge $memorylimit ]; then 
    overmemory=1 
    break 
fi 

Вся эта вещь выполняется в цикле, который держит генерацию новых значений для PARAMATERS к программе C.
Когда программа разбивает из петли из-за тайм-аута или более ограничить использование памяти, эта команда выполняется:
killall -q 0 program

Проблема:
Мое намерение, когда программа запускается в фоновом режиме (1-я строка выше), я могу ее контролировать. Затем перейдите к следующему запуску программы. Последовательное выполнение тестовых примеров.
Но, по всей видимости, все будущих прогонов программы были по расписанию ОС (Linux) по какой-то причине. То есть, если выполняется тестовый запуск 1, тестовые прогоны 2,3,4 и т. Д. Также запланированы (без выполнения Run 1). По крайней мере, кажется, что из нижеследующего замечания:
Когда я нажал Ctrl-C, чтобы закончить скрипт, он вышел из строя. Но новые экземпляры «программы» постоянно создаются. Сценарий закончился, но экземпляры программы все еще продолжаются. Я проверил и убедился, что сценарий закончился. Теперь я написал сценарий для бесконечной проверки экземпляров создаваемой программы и их уничтожения. И в итоге все заранее запланированные экземпляры программы были убиты и не было создано новых. Но это была большая боль.

  1. Правильно ли это внешний мониторинг программы?
  2. Любые подсказки о том, почему эта проблема возникает, и как ее исправить?
+0

Можете ли вы предоставить полный, автономный проигрыватель для этой проблемы? –

+0

http://mywiki.wooledge.org/ProcessManagement может представлять интерес для людей, которые, кстати, оказались на этом вопросе. –

ответ

0

Я бы сказал, что более правильный способ контролировать программы, как это было бы:

ULIMIT -v $ MemoryLimit

С такого предела, установленного любой процесс будет убить, если она использует слишком много виртуальной памяти. Также можно установить другие ограничения, такие как максимальное время использования процессора или максимальное количество открытых файлов.

Чтобы увидеть текущие ограничения вы можете использовать

ULIMIT -a

ULIMIT для Баша пользователей, если вы используете Tcsh команды использовать, вместо того, чтобы ограничить.