Вот еще один однострочный способ, который позволяет избежать дублирования
(crontab -l 2>/dev/null | fgrep -v "*/1 * * * * your_command"; echo "*/1 * * * * your_command") | crontab -
И вот способ сделать ответ JohnZ и избежать сообщения no crontab for user
, или если вам нужно работать в среде типа set -eu
и не может заставить что-либо вернуть ошибку (в этом случае часть 2>/dev/null
по желанию):
( (crontab -l 2>/dev/null || echo "") ; echo "0 * * * * your_command") | sort -u - | crontab -
Или, если вы хотите разделить вещи так, чтобы они были более читабельными:
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -
Или, при желании, удалите все ссылки на your_command (например: если расписание изменилось, вы хотите, чтобы оно когда-либо использовалось только один раз). В этом случае нам больше не нужно uniq
(добавлен бонус, порядок вставки также сохраняется):
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -