Короткий ответ
Идемпотентный скрипт при повторном запуске с теми же входными данными приводит систему к тому же конечному состоянию и не создаёт побочных эффектов заново (дублей записей, повторной отправки писем, ошибок "уже существует"); это важно, потому что cron, CI-ретраи или ручной повторный запуск после сбоя — обычная ситуация, а не исключение.
Как это работает подробнее
идемпотентность достигается проверкой текущего состояния перед изменением ("создать, если не существует", "обновить, если отличается") вместо слепого выполнения действия. Это отличается от простой "повторяемости" — скрипт может быть воспроизводимым (даёт одинаковый результат при одинаковом вводе), но не идемпотентным, если каждый запуск создаёт новую сущность.
Пример кода
example-477.sh
#!/usr/bin/env bash
set -euo pipefail
if [ ! -d /opt/app/releases/current ]; then
mkdir -p /opt/app/releases/current
echo "Директория создана"
else
echo "Директория уже существует, пропускаем создание"
fiЧто использовать на практике
- Рекомендация. типичные приёмы — использовать команды с флагами типа "create or update" вместо чистого "create", проверять наличие ресурса перед его созданием, использовать уникальные идемпотентные ключи при вызовах API, которые их поддерживают.
Подводные камни
- Ошибка. писать скрипт, который всегда делает
INSERTв базу или всегда отправляет уведомление без проверки, не отправлялось ли оно уже; считать, что раз скрипт "просто копирует файлы", он автоматически идемпотентен, забывая про накапливающиеся побочные эффекты вроде логов или временных файлов.