Несколько последовательных записей в crontab @daily обрабатываются последовательно, по порядку?

22

Я хочу, чтобы два задания выполнялись каждый день, последовательно, в том порядке, который я указал. Будет ли этот crontab надежно делать то, что я хочу?

@daily job1
@daily job2

Я предполагаю , что они бегают друг за другом, но я не смог найти ответ с помощью функции поиска в Интернете или с любой из этих страниц Справочника: cron(1), crontab(1), crontab(5).

Вышеприведенный crontab, очевидно, не будет делать то, что я хочу, если cron запускает операции, запланированные @dailyпараллельно, или в непредсказуемом порядке.

Я знаю, что могу просто сделать один сценарий оболочки, чтобы запустить их по порядку, мне просто любопытно, как должен работать cron (и мне лень собирать тестовые данные или читать исходный код).

Cron предоставляется cronпакетом. Операционная система - Ubuntu 10.04 LTS (сервер).

Адам Монсен
источник
Вы случайно не знаете, какой cron предоставляется cronпакетом? Почти все демоны cron, которые я знаю, будут обрабатывать это по порядку и синхронно, обычно сначала разбирая каждый файл в алфавитном порядке (хотя некоторые делают это по количеству времени между запусками в порядке возрастания), а затем задания внутри в порядке строк.
Крис Даун
5
Тот факт, что он недостаточно указан, обычно означает, что он оставлен на усмотрение реализации, и обычно лучше не зависеть от такого поведения. Вероятно, это чище и лучше организовано, чтобы поместить последовательность заданий, где последовательность имеет значение в своем собственном сценарии, а не в виде отдельных записей в crontab.
jw013
@ChrisDown: Vixie Cron, я думаю. packages.ubuntu.com/lucid/cron
Адам Монсен
1
Я бы посоветовал, если вы действительно хотите запустить их по порядку, сделайте один запуск через минуту.
Кевин
@ jw013 и Кевин: согласились, но это не мой вопрос.
Адам Монсен

Ответы:

26

После быстрого взгляда на источник (в Debian squeeze, который, я думаю, является той же версией), он выглядит как записи в данном файле и с одинаковым временем выполняется по порядку. Для этого @dailyи 0 0 * * *есть идентичные (по сути @dailyидентичные 0 0 * * *в этом cron).

Я бы не стал полагаться на это по всем направлениям. Вполне возможно, что однажды кто-нибудь решит, что cron должен выполнять задания параллельно, чтобы воспользоваться преимуществами этих 32-ядерных процессоров, в которых 31 ядро ​​работает вхолостую. Это может быть сделано при реализации этого 20-летнего элемента todo, встречающегося в источнике cron:

Все они должны быть помечены и ограничены по нагрузке; то есть вместо @hourly, означающего «0 * * * *», оно должно означать «близко к началу каждого часа, но не до низкой загрузки системы». (…) (VIX, январь 90)

Здесь очень легко написать @daily job1; job2. Если важно, чтобы задания выполнялись по порядку, сделайте это прямым следствием того, что вы пишете.

Кроме того, постановка заказа в явном виде устраняет риск того, что будущий администратор изменит порядок строк, полагая, что это не будет иметь значения.

Жиль "ТАК - перестань быть злым"
источник
5

http://ss64.com/osx/crontab.html (а также другие ссылки) говорит, что @daily эквивалентно

0 0 * * *

который говорит, чтобы бежать в полночь. Я ожидаю, что две линии такого рода будут запущены как можно ближе к полуночи, без какой-либо гарантии, какая из них будет первой. Я согласен с предложением jw013 в его комментарии:

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

Том Баррон
источник
Это помогает, спасибо. Я согласен с предложением @ jw013, но это не тот вопрос, который я задал. Я думаю, мне придется обратиться к фактическому источнику для окончательного ответа, так как это, вероятно, действительно, зависит от реализации.
Адам Монсен
0

@Giles комментирует использование единственного сценария, когда он импортируется, чтобы выполнить все по порядку.

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

Когда указано время, выполняются все задания, запланированные на текущую минуту. Это хорошая идея, чтобы использовать разные времена.

Если у вас есть задания, которые являются взаимоисключающими, обычно используется файл блокировки, чтобы определить, выполняется ли другое задание.

BillThor
источник
@dailyнемного отличается от /etc/cron.daily. Первый является альтернативным синтаксисом для использования в crontab. Также посмотрите на run-parts. Моя система использует run-partsдля запуска программ в /etc/cron.daily. Согласно run-parts(8)справочной странице, «Файлы запускаются в лексическом порядке сортировки их имен ...».
Адам Монсен