
Можно ли заставить cron получать инструкции из вывода скрипта оболочки вместо чтения статического файла?
Я пытаюсь управлять crontab-файлами на нескольких машинах, и поддержка отдельных файлов crontab для каждой машины — это рутина. Я бы хотел, чтобы cron вместо этого запускал скрипт оболочки, который выводит строки crontab для каждого задания в зависимости от того, назначена ли данная машина для этого задания. Могу ли я это сделать?
PS: Я видел, что некоторые предлагают использовать Puppet/Chef и т. д. для этой цели, но я думаю, что это излишне для решения только этой одной проблемы.
решение1
Я думаю, что самый простой способ сделать это в большинстве дистрибутивов — использовать автоматизированные инструменты развертывания, такие как Puppet/Chef, а также каталог /etc/cron.d. Вы можете разместить crontab в этом каталоге, за исключением того, что они используют следующий формат, а не типичный:
* * * * * <user> <command>
Где находится пользователь, который будет запускать cron.
Похоже, вы считаете, что Puppet — это излишество (это не так), но часть с каталогом применима и к любому другому решению.
решение2
Да, конечно, вы можете это сделать. Просто настройте любой скрипт, который вам нужен для создания выходных данных crontab, и отправьте его на целевые серверы.
Затем статическое задание cron может специально считывать эти файлы crontab для выполнения из любого удобного места.
решение3
Именно это и предполагается для куклы и ее друзей.
Единственной записью, которую вы crontab
можете сделать, может быть запуск агента puppet, если вам не нравится, как он настроен системой управления пакетами вашего дистрибутива.
Внешний сценарий будет на кукловоде. В одном месте. Для всех машин.
Если проблема настолько велика, что стоит рассмотреть возможность использования внешнего скрипта, я рекомендую puppet. Chef наверняка может сделать что-то подобное.
Я начал использовать Puppet только для управления ~/.ssh/authorized_keys
несколькими машинами, что является похожей «небольшой» проблемой.
решение4
Популярный трюк — сделать запись в crontab, которая обновляет весь crontab. Это будет работать нормально, пока ваш скрипт оболочки никогда не передает неверные данные в crontab
.
Однако я предлагаю другой подход, который будет проще в управлении: иметь статическую запись crontab, которая часто запускает скрипт. Заставьте скрипт выполнять всю тяжелую работу по определению того, когда пора что-то запускать. Таким образом, вы по-прежнему можете использовать crontab как обычный crontab, не заставляя скрипт знать обо всем, что может быть запущено на каждой машине.