ЛР3
Параллельный агрегатор статистики (fork)

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

Задача заключается в разработке программы-агрегатора, которая в качестве параметров командной строки получает имя целевого файла и набор имен файлов журнала. Программа распараллеливает свою работу с использованием fork, обеспечивая обработку каждого файла журнала в отдельном процессе. Результат обработки каждый процесс конкурентно размещает в целевом файле, учитывая его предыдущее содержимое. Для обеспечения эксклюзивного доступа к целевому файлу в агрегаторе следует использовать любые известные файловые блокировки (flock, lockf). В заблокированном состоянии целевой файл должен находиться минимально возможный промежуток времени.

Для обработки предлагается использовать набор журналов доступа к веб-порталу ШГПУ за 6 дней января 2021 года. Для изменения файла журнала можно воспользоваться "перемешивателем" shuffle.pas. Каждый журнал представлет собой csv-файл, первая строка которого содержит набор имен полей, например:

"id";"remote_host";"date_time";"method";"server_name";"port";"directory";"file_name";"query";"status";"recv_seconds";"recv_bytes";"user_agent"
"1";"10.0.10.10";"2021-01-01 00:00:01";"GET";"files.shgpi.edu.ru";"80";"/files/rasp/faculty/f05/11_02_2013_17_02_2013/";"11_02_2013_17_02_2013.doc";;"404";"0";"261";"Googlebot/2.1 (+http://www.google.com/bot.html)"
"2";"54.36.148.122";"2021-01-01 00:00:00";"GET";"shgpi.edu.ru";"80";"/special/struktura-universiteta/nauka/novosti-nauka/6ccc0a74381abde5d6e756edb95af498/";;"?L=556&tx_ttnews%5Bcat%5D=3&tx_ttnews%5Bpointer%5D=33";"200";"1";"100612";"Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)"
"3";"66.249.64.192";"2021-01-01 00:00:01";"GET";"shgpi.edu.ru";"80";"/files/rasp/faculty/f05/11_02_2013_17_02_2013/";"11_02_2013_17_02_2013.doc";;"404";"0";"261";"Googlebot/2.1 (+http://www.google.com/bot.html)"
"4";"109.252.201.243";"2021-01-01 00:00:00";"GET";"lib.shgpi.edu.ru";"443";"/forum/img/besedka/gorockop/";"pic.php222.gif";;"200";"0";"415747";"Mozilla/5.0 (Linux; Android 10; SM-M315F Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.138 Mobile Safari/537.36 YandexSearch/8.70 YandexSearchWebView/8.70"
"5";"54.36.148.204";"2021-01-01 00:00:00";"GET";"shgpi.edu.ru";"80";"/en/studentu/novosti-studentu/voprosy-gumanitarnogo-obrazovanija-obsudili-v-khode-molodjozhnoi-konferencii/";;;"200";"0";"73195";"Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)"
...
Целевой файл должен содержать количество посещений для каждого уникального имени сервера веб-портала ШГПУ (повторение имен недопустимо), например:
shgpi.edu.ru 12345
lib.shgpi.edu.ru 234
vt.shgpi.edu.ru 567
files.shgpi.edu.ru 4321
...
Пример запуска программы:
./aggrlogs result.txt 2021_01_01_shgpi_edu_ru.csv 2021_01_02_shgpi_edu_ru.csv 2021_01_03_shgpi_edu_ru.csv 2021_01_04_shgpi_edu_ru.csv
В данном примере из текущего каталога запускается агрегатор aggrlog, результат обработки размещается в файле result.txt, обрабатываться файлы журналов 2021_01_02_shgpi_edu_ru.csv, 2021_01_03_shgpi_edu_ru.csv и 2021_01_04_shgpi_edu_ru.csv, каждый в отдельном процессе.