steadrun — маленькая утилита для задач, которые запускаются не из Laravel: bash-скриптов, бэкапов, скриптов
на Python, Node.js или Go. Она оборачивает команду и сама отправляет пинги:
steadrun run ВАШ-UUID -- pg_dump -Fc mydb -f /backup/db.dump
Сниппет с curl в конце строки crontab сообщает только об успехе. С steadrun Steadrun сразу узнаёт и о
падении, а в алерт попадают код выхода и последние строки вывода. По ним обычно и видно, что сломалось.
Установка
Это один бинарник без зависимостей. Для Linux на x86-64:
sudo curl -fsSL -o /usr/local/bin/steadrun https://github.com/Steadrun-App/steadrun-cli/releases/latest/download/steadrun-linux-amd64
sudo chmod +x /usr/local/bin/steadrun
steadrun version
На Linux ARM замените в адресе steadrun-linux-amd64 на steadrun-linux-arm64, на Mac с Apple Silicon — на
steadrun-darwin-arm64. Контрольные суммы лежат в файле checksums.txt в том же релизе на GitHub.
Если установлен Go, можно так: go install github.com/Steadrun-App/steadrun-cli/cmd/steadrun@latest.
Как подключить к cron
Создайте в Steadrun проверку типа «Cron» с тем же расписанием, что у задачи, и допишите steadrun run перед
командой:
0 3 * * * /usr/local/bin/steadrun run ВАШ-UUID -- /home/deploy/backup.sh
Всё, что стоит после --, — команда с её аргументами. Пайпы и && внутри команды оберните в sh -c:
0 3 * * * /usr/local/bin/steadrun run ВАШ-UUID -- sh -c 'pg_dump mydb | gzip > /backup/db.sql.gz'
Иначе пайп разберёт shell, и steadrun будет следить только за pg_dump mydb.
Что происходит при запуске
- До старта команды уходит
/start. Steadrun отметит, что задача началась, и посчитает время её работы. - Команда работает как обычно. Её вывод идёт туда же, куда шёл: в терминал, в лог или в письмо от cron.
- Если код выхода 0, уходит обычный пинг. Если любой другой, уходит
/failс текстомExit code: Nи последними 8 КБ вывода. steadrunзавершается с тем же кодом выхода, что и команда.
Если команду остановили сигналом (kill, остановка контейнера), это тоже падение. steadrun передаёт команде
SIGINT и SIGTERM, поэтому она успевает завершиться сама.
Каждый запрос к Steadrun ждёт не дольше 5 секунд. Если Steadrun недоступен или UUID указан с ошибкой, в stderr
появится одна строка вида steadrun: ping/start: HTTP 404, а команда отработает как обычно.
Docker и Kubernetes
Положите бинарник в образ:
ADD https://github.com/Steadrun-App/steadrun-cli/releases/latest/download/steadrun-linux-amd64 /usr/local/bin/steadrun
RUN chmod +x /usr/local/bin/steadrun
И запускайте задачу через него. Пример для Kubernetes CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 3 * * *"
timeZone: "Europe/Moscow"
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: backup
image: registry.example.com/backup:latest
command: ["steadrun", "run", "ВАШ-UUID", "--", "/app/backup.sh"]
steadrun работает как PID 1 и передаёт команде SIGTERM, когда Kubernetes останавливает под. Если под так и не
запустился, например образ не скачался, пинга не будет совсем, и Steadrun пришлёт алерт, когда истечёт
grace-период.
Что уходит в Steadrun
При падении в Steadrun уходят код выхода и последние 8 КБ вывода. Они сохраняются в истории проверки и приходят в
алертах на почту, в Telegram и на вебхук. Не оборачивайте команды, которые могут напечатать пароли, токены или
данные пользователей. Для таких задач подойдёт обычный пинг через curl из рецептов.
Переменные окружения
Одна: STEADRUN_BASE_URL, адрес Steadrun. По умолчанию https://steadrun.ru.
Что дальше
- Пинги: что значат
/startи/fail. - Рецепты: примеры для systemd, Docker, CI и разных языков.
- Исходный код на GitHub, лицензия MIT.