У меня есть программа на языке 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, чтобы закончить скрипт, он вышел из строя. Но новые экземпляры «программы» постоянно создаются. Сценарий закончился, но экземпляры программы все еще продолжаются. Я проверил и убедился, что сценарий закончился. Теперь я написал сценарий для бесконечной проверки экземпляров создаваемой программы и их уничтожения. И в итоге все заранее запланированные экземпляры программы были убиты и не было создано новых. Но это была большая боль.
- Правильно ли это внешний мониторинг программы?
- Любые подсказки о том, почему эта проблема возникает, и как ее исправить?
Можете ли вы предоставить полный, автономный проигрыватель для этой проблемы? –
http://mywiki.wooledge.org/ProcessManagement может представлять интерес для людей, которые, кстати, оказались на этом вопросе. –