Установка крона в течение каждых 30 часов в Debian

Один длинный список

Используя grep

Вы могли просто использовать расширение оболочки на /proc и передайте его по каналу к grep:

$ echo /proc/* | grep -oP "(?<=/proc/)\D.*? " | paste -s -d ''

Пример

$ echo /proc/* | grep -oP "(?<=/proc/)\D.*? " | paste -s -d ''
acpi asound buddyinfo bus cgroups ....

Вышеупомянутое использует grepспособность использовать механизм регулярного выражения Perl (PCRE). Это -P переключатель к grep. -o говорит grep только возвратить строки, которые соответствуют шаблону. Мы затем используем способность Perl к lookbehinds. Таким образом, когда мы находим строку этим существа с /proc, мы затем заботимся /proc для любых строк, которые не запускаются с цифры (\D). Это строки, которые являются возвратом (нецифра стартовые).

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

Используя sed

Альтернатива этому методу должна была бы использовать sed вместо этого (эй, который рифмует).

$ echo /proc/* | sed 's@/proc/[0-9]\+ @@g;s@/proc/@@g'

Этот подход находит все строки, запускающиеся с /proc/ И цифры и пространство и заменяют ими ни с чем, эффективно удаляя их. После этого мы делаем другого sed команда, которая делает то же к /proc/ строки, и нас оставляют только с начальными строками нецифры.

Несколько столбцов

Для "сопоставления" вывода в столбцы, paste команда делает это довольно легко. Здесь я делаю 2 столбца, но можно измениться paste команда для генерации более или менее путем добавления дополнительных тире (-). column -t в конце вынуждает вывод выстроиться в линию на столбцах.

$ ls /proc | grep -v "^[0-9].*" | paste - - | column -t

Пример

Сначала 5 строк вывода благодаря head -5.

$ ls /proc | grep -v "^[0-9].*" | paste - - |column -t | head -5
acpi           asound
buddyinfo      bus
cgroups        cmdline
cpuinfo        crypto
devices        diskstats

Вот то же самое с 4 столбцами:

$ ls /proc | grep -v "^[0-9].*" | paste - - - - |column -t | head -5
acpi           asound         buddyinfo     bus
cgroups        cmdline        cpuinfo       crypto
devices        diskstats      dma           dri
driver         execdomains    fb            filesystems
fs             interrupts     iomem         ioports

Примечание: На ответ @JosephR., если Вы встречаетесь с какими-либо проблемами с вышеупомянутыми командами, которые анализируют вывод от ls, можно снабдить префиксом его команду Bash, command, который обойдет любые псевдонимы, можно иметь в распоряжении для ls.

Пример

$ command ls /proc | grep -v "^[0-9].*" | paste - - - - |column -t | head -5
acpi           asound         buddyinfo     bus
cgroups        cmdline        cpuinfo       crypto
devices        diskstats      dma           dri
driver         execdomains    fb            filesystems
fs             interrupts     iomem         ioports
3
12.03.2014, 14:51
3 ответа
[112406] Самым простым решением, вероятно, было бы более частое выполнение задания cronjob и использование оберточного скрипта для выхода без каких-либо действий, если прошло недостаточно времени.


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

Итак, для "каждые 30 часов 30 минут" это будет "каждые 30 минут", а для "каждые 30 часов" это будет "каждые 6 часов" (самый большой общий коэффициент 30 и 24)

  1. Вы можете реализовать обертку одним из двух способов:
  2. Сначала вы можете сохранить временную метку в файле, а затем проверить, не превышает ли разница во времени между сейчас и сохраненной временной меткой 30 часов и 30 минут или она равна ей.
  3. Это кажется достаточно простым, но имеет две потенциальные ловушки, которые усложняют код:
  4. Небезопасный разбор сохраненного файла временных меток
  5. Позволяет немного перемотать назад [113058]и [113059] при сравнении временных меток, так как другие вещи, происходящие в системе, приведут к тому, что интервал [113060]фактический [113061] будет перемотан.
  6. Второй вариант - вообще не хранить файл временных меток и, вместо этого, провести некоторые математические расчеты. Это также теоретически быстрее, так как ядро может вернуть системное время, не опрашивая жесткий диск.
  7. Я не тестировал это на опечатки, но вот код на Python, который был расширен для наглядности.
  8. Идея такова:
Так же, как "остановленные часы работают два раза в день", так и значение [113062]minutes_since_epoch % full_interval[113063] будет только меньше, чем [113064]cron_interval[113065] один раз за [113066]full_interval[113067].

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

Проще всего это сделать, используя [113068][0, cron_interval)[113069] в качестве окна, внутри которого задача должна попасть, чтобы быть выполнена.

Для учета джиттера в обоих направлениях, мы сдвигаем начальный край окна назад на 10% его длительности, так как запуск слишком рано будет редким, а запуск слишком поздно может произойти в любой момент, когда система настолько погружена в работу, что оберточный скрипт задерживается при вызове [113070] времени. time()[113071].

Если, как я подозреваю, [112862]get_top.py[112863] - ваше собственное творение, просто прикрепите это сверху и измените проверку на

4
27.01.2020, 21:12
[112400]Правильны несколько человек. [112834]*/30[112835] не действует в колонке часа, поскольку (в любой колонке), [112836]*/n[112837] означает "все, что делится на [112838]n[112839]". Обычно это объясняется как "каждое [112840]n[112841] без разницы", но на самом деле это не так; например, если вы поместите [112842]*/5[112843] в столбец часов, скрипт будет работать в 0:00, 5:00, 10:00, 15:00 и 20:00.

  • Кроме того, столбцы не зависят друг от друга. Если вы поместите [112844]*/10[112845] в колонку часов и [112846]2,17[112847] в колонку минут, скрипт будет работать в 0:02, 0:17, 10:02, 10:17, 20:02 и 20:17.

Я не знаю простого способа запускать скрипт каждые 1830 минут. Вы могли бы использовать скрипт для изменения расписания через 1830 минут с помощью команды [112848]at[112849], но это не очень надежно.[112405].

2
27.01.2020, 21:12
[114138]Вот метод для того, чтобы сделать то, что вы хотите, с оговоркой, что он будет выполняться каждые 30 часов со времени эпохи Unix.

Он будет выполняться каждый час, выполняя вычисления, чтобы определить, делится ли этот час на 30. Если это modulo разделение ([114600]% 30[114601]) вернет 0, что означает, что мы находимся в 30-часовой ситуации. Если это так, то ваша команда ([114602]your_command[114603]) будет выполнена.

Как уже упоминали другие, вы не можете делать то, что хотите, используя [114604]*/30[114605], так как эти значения превышают значение этого конкретного временного поля в cron.

Вы можете дополнительно настроить приведенный выше пример, если вам нужно перекосить его на 30 минут, либо настроив крон (например, используя 30 вместо 0), либо добавив 30 к условному блоку.[114145].

1
27.01.2020, 21:12

Теги

Похожие вопросы