Учитывая частоту, я обычно пишу демон (сервер), который приятно ждет без дела между запусками заданий (т. Е. sleep()
), вместо того, чтобы пытаться использовать cron для достаточно детального доступа.
Если необходимо, в системах Unix / Linux вы можете запустить его с /etc/inittab
(или с заменой), чтобы гарантировать, что он всегда работает и автоматически перезапускается в процессе, уничтожается или умирает.
Добавлено : (и некоторые ненужные вещи удалены)
Преимущество всегда присутствующего (работающего, но в основном бездействующего) демона заключается в исключении возможности одновременного запуска сценария cron автоматически.
Однако это означает, что вы несете ответственность за правильное управление временем, например, в случае наложения (т. Е. Предыдущий прогон все еще выполняется, в то время как происходит новый триггер ). Это может помочь вам решить, использовать ли разветвляющийся демон или не разветвленный дизайн. Потоки не дают никаких преимуществ в этом сценарии, поэтому нет необходимости рассматривать их использование.
Это не полностью исключает возможность запуска нескольких процессов, но является общей проблемой для многих демонов. Типичное решение - использовать семафор, такой как взаимоисключающая блокировка файла, для предотвращения запуска второго экземпляра. При завершении процесса блокировка файла автоматически забывается, поэтому в случае аварийного завершения (например, сбоя питания) не требуется очистка самой блокировки.
Подход с использованием модуля Fcntl и использованием Perl sysopen
с флагом O_EXCL
(или O_RDWR | O_CREAT | O_EXCL
) был , данный Грегом Бэконом . Единственные различия, которые я хотел бы сделать, - это объединить эксклюзивную блокировку в вызове sysopen (т.е. использовать предложенные мной флаги) и удалить тогда избыточный вызов flock
. О, и я бы следовал соглашениям о файловой системе UNIX (& Linux FHS) и именовании /var/run/daemonname.pid
.
Другим подходом было бы использовать daemontools или , аналогичные , для "демонизации" задачи.