Я хотел бы написать службу Linux с помощью PERL, но не знаю, как это сделать. (Я знаю Perl)
У меня есть база данных MySQL, и мне нужно проверить ее на наличие новых записей, чтобы я мог их обработать. Служба должна отвечать почти мгновенно, поэтому cron - не лучший выбор для меня, и я не хочу использовать какие-то обходные пути, чтобы запускать свой скрипт каждую секунду. Кроме того, сценарий является многопоточным и может занять некоторое время до завершения, поэтому cron для меня не очень хороший выбор.
Итак, у меня есть два пути:
Сервис, который ежесекундно запрашивает базу данных и обрабатывает новые записи по мере их поступления. Или что-то вроде триггера MySQL, который запускает скрипт при вставке новой записи. Однако это не должно замедлять работу другого программного обеспечения, которое вставляет записи.
Что вы мне предлагаете? Как лучше всего этого добиться?
edit: Например, нужно ли мне делать что-то подобное при написании службы?
while (1) {неужели спать (1)} и написать простой сценарий инициализации? Есть ли способ более элегантный?
Заранее спасибо,
Есть несколько модулей CPAN, которые позволяют писать процесс-демон. например Демон :: Демонизировать.
Я не на 100% уверен, что это такая хорошая идея, в зависимости от того, как обрабатывается база данных MySQL, поскольку вам нужно тщательно управлять подключением к базе данных, но для ваших администраторов это становится намного проще. Также помните, что нужно быть осторожным с входящими и явными блокировками, поскольку база данных используется другим приложением, которое может не работать с заблокированными таблицами.
Если у вас много вставок записей, запуск внешней службы для каждой вставки убьет ваше приложение. Затем вы захотите обработать его партиями в соответствии со временем. Однако при небольшом количестве вставок вы можете не дожидаться запуска пакетного процесса. Тогда триггер может быть хорошим.
Чтобы предотвратить сбой при сбое, вы можете настроить его на респаун сам. Есть несколько способов сделать это, в том числе с помощью DAEMON Tools как уже упоминалось, порождает его как часть inittab или даже в оболочку скриптом оболочки, который выполняет бесконечный цикл.
Вложенные бесконечные циклы!
FWIW, мне нравится решение «бесконечного цикла без разветвления» в сочетании с супервизором процессов, таким как daemontools DJB. Я думаю, что Upstart ubuntu также предоставляет это. Ключевой особенностью является настройка вашего супервизора на автоматический перезапуск вашей службы в случае сбоя.
В случае с daemontools он также позволяет делегировать ведение журнала другой выделенной программе. Все, что нужно сделать вашему сервису, - это распечатать в стандартный вывод. Когда вы настраиваете службу ведения журнала для своего сценария, вы можете использовать multilog и вести личный журнал или использовать / usr / bin / logger и выводить в системный журнал, и все это без изменения вашего сценария. (Upstart может предоставить это, но я не знаю, мой основной опыт работы с daemontools)
И если вы ненавидите распространение DJB, подумайте о Запустить его, который является форком daemontools DJB и предоставляет большую часть той же функциональности.
Я также предлагаю вам сделать это на C, если это возможно. Если требуется скорость, ее не победить. Проверять, выписываться:
Я бы предположил, что сценарий Perl отслеживает двоичный журнал MySQL и действует при любом изменении размера (что может указывать на добавление / удаление / обновление строк в любом месте базы данных).
Вы можете использовать Время :: HiRes модуль, чтобы засыпать на четверть секунды за раз, и проверьте, не изменился ли размер файла журнала, а затем запустите соответствующий SQL.