Применить sed к строкам crontab? - PullRequest
1 голос
/ 09 августа 2009

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

Задания, которые могут быть изменены, будут содержать комментарий в конце строки "# change-enabled".

15 5 7,14,21,28 * * /path/to/executable1 #change-enabled
15 * * * * /path/to/executable2
45 5 */2 * * /path/to/executable3 #change-enabled

Затем я хочу направить вывод из "crontab -l" через sed, чтобы перехватить и изменить задания с этим комментарием в конце, и передать результаты этого через "crontab -".

// Редактировать

Моя интуиция говорит мне, чтобы я не делал этого как root, потому что новый час определяется с использованием данных от третьей стороны. (API экспорта данных Google Analytics) Так что /etc/cron.d/ - это то, что я собираюсь избегать для этого приложения.

Вот команда, которая работала со всеми моими текущими заданиями cron во время отладки. Я использовал «date +% l» вместо «/ home / user / slow-hour» и отключил «| cron -», чтобы посмотреть, что будет напечатано.

crontab -l | sed -e "s/^\([^ ]*\) [0-9]* \(.*#change-enabled\)/\1`/home/user/slow-hour` \2/" | crontab -

Содержимое ~ / slow-hour будет скриптом, который извлекает почасовые данные для профилей веб-сайтов в Google Analytics и ищет самый медленный час. В случае какой-либо ошибки этот скрипт вернет 1:00, отправьте мне уведомление по почте и затем поручитесь.

Чтобы уменьшить вероятность пропуска выполнения дней из-за медленного часа, предшествующего текущему часу, автоматический хронограф будет настроен на работу в полночь, и вернется самый ранний час ~ / медленный час Быть 1 утра.

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

Ответы [ 4 ]

2 голосов
/ 09 августа 2009

Если вы хотите установить час на 8, одна команда будет

sed -e 's/\([0-9]*\) [0-9]* \(.*#change-enabled\)/\1 8 \2/'
2 голосов
/ 09 августа 2009

Вы можете сделать это, но есть лучший способ (при условии, что у вас есть root-доступ).

Вместо того, чтобы изменять crontab, разделите задания на связанные группы. Для каждой группы поместите новый файл в /etc/cron.d/{jobname}. Таким образом, вы можете просто восстановить один сценарий без проблем - без необходимости использования Sed Magic. Разделите все, что может измениться, на отдельные файлы, чтобы вы просто записали новый файл вместо старого и не связывались с записями, которые не нужно менять.

Единственная разница заключается в синтаксисе. Вместо:

<time> <command>

вы должны поставить туда:

<time> <user> <command>

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

Пример - вместо 'crontab -l | sed -e 's/....somejob.../.../ | crontab ..' just run 'echo .... > /etc/cron.d/somejob '

2 голосов
/ 09 августа 2009

crontab -l | sed '/ change-enabled $ / s / pat / repl /' | crontab -

0 голосов
/ 09 августа 2009
crontab -l | sed -re '/# *change-enabled *$/s/^([^ ]+) [^ ]+/\1 new_hour/' | crontab -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...