Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумНастройка и подключение

Автозапуск прогона после перезагрузки сервера

zapuskator
zapuskator
Участник
сообщений 420
с ноя
8 июня, 11:17первое сообщение

Хостер ночью перезагрузил машину, прогон не поднялся, потерял восемь часов сбора.

Держал я его в tmux, запускал руками. Понятно, что после ребута сессии нет. Прописал @reboot в крон, перезагрузил проверить: скрипт стартовал, отработал две минуты и упал с ошибкой разбора имени.

@reboot /opt/sbor/run.sh >> /var/log/sbor.log 2>&1

Сеть, похоже, ещё не готова в этот момент. Костылить sleep на минуту как-то стыдно.

Денис Прошин
Денис Прошин
Знаток
сообщений 1000
с июн
15 ноября, 14:34#2

Стыдно и ненадёжно. Минуты то не хватает, то хватает с запасом в пятьдесят секунд простоя.

Крон про состояние машины ничего не знает, он дёргает задание, как только сам поднялся. Порядок загрузки ему безразличен. Именно поэтому @reboot и ловит то отсутствие сети, то незамонтированный диск с выгрузкой, то неподнятый DNS. Симптомы плавают от загрузки к загрузке, и это худший вид поломки: два раза из трёх всё хорошо.

Правильное место для такого запуска это служба. Там зависимости описываются словами, а менеджер сам выстраивает очередь. Нужна сеть с адресом на руках, пишете After=network-online.target и обязательно Wants=network-online.target, иначе цель просто не будет активирована и первая строка ничего не даст. Нужен смонтированный каталог, добавляете RequiresMountsFor=/data. Нужен запуск с задержкой после готовности, берёте таймер с OnBootSec.

Плюс к этому вы получаете перезапуск при падении, журнал в одном месте и остановку одной командой. Крон ничего из этого не умеет.

[Unit]
Description=sbor
After=network-online.target
Wants=network-online.target
RequiresMountsFor=/data

[Service] ExecStart=/opt/sbor/run.sh Restart=always RestartSec=30 User=sbor

[Install] WantedBy=multi-user.target ```

pingpong
pingpong
Новичок
сообщений 105
с июн, второй сезон
22 апреля, 17:51#3

а enable не забыть, у меня из-за этого дважды не поднималось

Ирина Пахомова
Ирина Пахомова
Новичок
сообщений 280
с янв, второй сезон
1 сентября, 08:08#4

Про enable плюсую, без него юнит просто лежит файлом.

И заложите ещё одну мелочь: network-online.target считает сеть готовой чуть раньше, чем наружу реально проходит запрос. У нас это лечится ожиданием прямо в скрипте запуска, служба первым делом упирается в проверку и ждёт, пока связь появится:

#!/bin/bash
for i in $(seq 30); do
  curl -sf -m 5 -x http://193.0.2.44:8000 https://example.org/ip >/dev/null && break
  sleep 5
done
exec /opt/sbor/venv/bin/python /opt/sbor/run.py

Полторы минуты потолок ожидания, обычно проходит с первой попытки. Зато старт больше не зависит от того, в каком порядке поднимаются службы у хостера.

zapuskator
zapuskator
Участник
сообщений 420
с ноя
8 февраля, 11:25#5
pingpong: а enable не забыть

Забыл ровно его, спасибо. Плюс вставил ожидание в run.sh, перезагрузил трижды подряд, все три раза прогон поднялся сам и пошёл с первой минуты.

Крон из этого места убрал совсем, оставил только службу с таймером. Спасибо, вопрос снят.