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

Ночные прогоны и сон: как совместить

mila_ops
mila_ops
Новичок
сообщений 175
с апр, второй сезон
8 февраля, 11:37первое сообщение

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

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

Что вы ставите между запуском и утром? Надо понять, что должно случиться, если прогон упал в три ночи: перезапуск, сообщение, остановка до утра. И как утром за минуту понять, что ночь прошла нормально.

cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
15 июля, 14:54#2

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

flock снимает это одной строкой в начале скрипта.

zapuskator
zapuskator
Участник
сообщений 420
с ноя
22 декабря, 17:11#3

И сразу переезжайте с крона на таймер systemd. Там есть Persistent, есть отдельная запись о каждом запуске в журнале, и главное есть OnFailure, который дёргает второй юнит при падении.

mila_ops
mila_ops
Новичок
сообщений 175
с апр, второй сезон
1 мая, 08:28#4
zapuskator: есть OnFailure, который дёргает второй юнит

Вот этого я и не знала. То есть уведомление живёт отдельным юнитом и в сам скрипт лезть не надо?

cronjob, про замок поняла, ставлю сегодня же.

queue_master
queue_master
Участник
сообщений 410
с ноя
8 октября, 11:45#5

Лезть не надо. Пишете два файла и забываете про них.

# /etc/systemd/system/progon.service
[Unit]
Description=nochnoy progon
OnFailure=uvedomlenie@%n.service

[Service] Type=oneshot ExecStart=/usr/local/bin/progon.sh ```

# /etc/systemd/system/progon.timer
[Timer]
OnCalendar=*-*-* 01:30:00
RandomizedDelaySec=600
Persistent=true

[Install] WantedBy=timers.target ```

Разброс старта тут не для красоты: если таймеров несколько, они перестают стартовать в одну секунду и драться за канал.

очередь длиннее памяти
Пётр Мельник
Пётр Мельник
Участник
сообщений 810
с июл
15 марта, 14:02#6

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

сначала замер, потом мнение
batchrunner
batchrunner
Участник
сообщений 470
с окт
22 августа, 17:19#7

Сторож у меня простой: раз в десять минут читает ту самую строку и сравнивает с прошлой. Не сдвинулась за полчаса, значит прогон висит.

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

Влад Терентьев
Влад Терентьев
Участник
сообщений 745
с авг
1 января, 08:36#8

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

Делается это скучно и надёжно. Список заданий кладётся в файл или таблицу, у каждой строки статус: ждёт, в работе, готово, ошибка. Скрипт берёт первую строку со статусом «ждёт», помечает её как «в работе», делает дело и ставит «готово». Упал посреди, при следующем старте всё, что висит в работе дольше получаса, возвращается в «ждёт».

путь одной строки задания
путь одной строки задания

После этого перезапуск перестаёт быть событием. Он стоит вам нескольких минут, потерянных заданий нет вообще.

sysdiag
sysdiag
Знаток
сообщений 1975
с фев
8 июня, 11:53#9

Логи читаю раньше почты, поэтому добавлю про утро. Сделайте отдельный короткий файл итога: время старта, время финиша, сколько сделано, сколько ошибок, три последние строки с ошибками. Читается за десять секунд, полный лог открываете, только когда итог не нравится.

логи читаю раньше почты
cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
15 ноября, 14:10#10

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

mila_ops
mila_ops
Новичок
сообщений 175
с апр, второй сезон
22 апреля, 17:27#11

Собираю по порядку, чтобы самой не запутаться.

Что ставлюПротив чего
Замок на запускдва прогона поверх друг друга
Таймер вместо кронапропущенные запуски и разъезд по времени
OnFailure с уведомлениемтишина при падении в три ночи
Файл прогресса и сторожзависший процесс до утра
Статусы заданий в таблицепотеря всей ночи из-за одной ошибки
Короткий файл итогачтение полного лога спросонья

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

Пётр Мельник
Пётр Мельник
Участник
сообщений 810
с июл
1 сентября, 08:44#12

Отпишитесь через месяц, интересно, что покажет сторож на длинной дистанции.

сначала замер, потом мнение