У меня есть сценарий развертывания, он должен что-то добавить пользователю crontab
(запускать сценарий, который очищает журналы каждые XXX дней), однако это необходимо делать только во время первого развертывания или когда его необходимо обновить.
(Я могу бежать xxx.py deploy env
или xxx.py update env
)
поэтому я должен сделать это:
Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different
Я не вижу, как добавить / проверить / удалить что-либо crontab
без использования crontab -e
или редактирования crontab
файла (загрузить его, переписать, повторно загрузить)
PS: это специфический для пользователя cronjob, "webadmin" собирается это сделать, и ему не следует использовать sudo для этого.
/etc/cron.d
? Если это так, поместите ваш сценарий туда, используя уникальное имя для вашего приложения/etc/crontab
файлы в/etc/cron.d/
имеют дополнительное поле для имени пользователя, сразу после спецификации расписания. например* * * * * username /path/to/script
. Смотритеman 5 crontab
и ищитеSYSTEM CRON
.Ответы:
моя лучшая идея
сначала проверить, соответствует ли содержимое тому, что должно быть там, и обновить, только если оно не соответствует:
но это становится достаточно сложным, чтобы создать отдельный скрипт для этой задачи cron.
другие идеи
Вы можете отправить строку через stdin в crontab (будьте осторожны, это удалит все предыдущие записи в crontab):
это должно работать даже через ssh:
если вы хотите добавить файл, вы можете использовать это:
источник
echo '*...
расширил*
список файлов. 2) окончания строк в crontab были удалены.echo "*...
и 2) удалитьecho $
из начала строки.Для записи я собираюсь предложить использовать
/etc/cron.d/
. Только root может записывать файлы здесь, но записи могут быть запущены как любой пользователь (без необходимостиsudo
).Это может быть применено несколько раз, обновляя локальный
webadmin.cron
файл по мере необходимости перед его копированием.Вы даже можете удалить предоставление:
Обратите внимание, что во многих случаях вы не можете предоставить пароль пользователя root для команд
scp
/ssh
. Вместо этого вам нужно настроить сертификаты открытого / закрытого ключа. Также подразумевается, что локальная учетная запись (какой бы она ни была) будет иметь полный root-доступ к удаленному серверу. На данный момент неясно, будет ли это шоу-стопором для вашего конкретного сценария.источник
/etc/cron.d/
существует именно для этой цели - поэтому пакеты / развертывания могут просто вставить сюда файл crontab.Я настоятельно рекомендую использовать для этого Ansible *, а не использовать свой собственный. Или Puppet или Chef - но Ansible хорошо подходит для таких сценариев развертывания без инфраструктуры, как этот.
Это потому, что уже есть модули, предназначенные для решения подобных проблем, и инструменты управления конфигурациями имеют идемпотентность в качестве основной цели проектирования - это свойство изменять только тогда, когда это необходимо, даже если вы случайно (или намеренно) запустите его снова.
В частности, модуль cron Ansible может изменять пользовательские crontabs. В качестве бонуса, если вы захотите позже использовать системные crontabs, это будет очень просто, а не переписывать.
* Отказ от ответственности: я работаю в Red Hat, а Ansible - это проект, спонсируемый Red Hat.
источник
Если вы хотите добавить задание cron через целевую учетную запись, запустите
crontab -e
. Эта команда передает crontab через редактор. Скажите ему использовать команду редактора, которая изменяет crontab по вашему желанию. Команда редактора выполняется в виде фрагмента оболочки с добавлением имени временного файла.Этот подход более надежен, чем собственный,
crontab -l | … | crontab -
потому что он уязвим для состояния гонки, если crontab редактируется одновременно: изменения, сделанные между вызовомcrontab -l
и вызовомcrontab -
, будут отменены.источник
Это адаптация того, что предложил @ phillip-zyan-k-lee-stockmann , на основе его кода «Лучшая идея на данный момент».
Мои изменения из его (отличный и полезный фрагмент) в основном:
И вот мой код для того, что я назвал
crontab-add-hourly.sh
:Пример использования и вывод:
источник
TL; DR: это на самом деле работает, протестировано в Bash 4.4.
Как отмечено в комментариях @Phillip -Zyan K Lee- Stockmann, это решение распространяется
*
на все файлы в текущем каталоге. Я не мог заставить предложение комментариев работать. set -f отключает расширение по шаблону, см. https://stackoverflow.com/a/11456496/915441 .источник