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

Временные файлы после прогона: когда и чем удалять

zavarka
zavarka
Участник
сообщений 435
с ноя
8 февраля, 11:37первое сообщение

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

Сейчас у меня в конце скрипта стоит rm -rf, и когда до него доходит, всё хорошо. Не доходит примерно в трети случаев.

Кто как убирает за собой, если середина прогона может отвалиться в любой момент?

чайник кипит, скрипт бежит
stackfix
stackfix
Участник
сообщений 495
с окт
15 июля, 14:54#2

Уборка в конце скрипта работает ровно до первого падения, вы это уже видите. Вешайте её на выход из скрипта, тогда она отработает и после ошибки, и после ручного прерывания.

#!/usr/bin/env bash
set -euo pipefail

RABOTA=$(mktemp -d /var/tmp/sbor.XXXXXX) ubrat() { rm -rf "$RABOTA"; } trap ubrat EXIT

# всё промежуточное складываем только сюда curl -sS https://example.org/list > "$RABOTA/syrye.json" obrabotat "$RABOTA/syrye.json" > /opt/sbor/gotovo/vygruzka.json ```

Два правила к этому. Первое: временное живёт в одной папке, никаких файлов вразброс. Второе: готовый выхлоп кладём мимо этой папки, иначе уборщик заберёт и его. На mktemp -d с шаблоном настаивать буду отдельно, потому что два одновременных прогона с фиксированным именем папки затирают друг друга.

пишу скрипты, чтобы не писать скрипты
Егор Пастухов
Егор Пастухов
Новичок
сообщений 78
с июл, второй сезон
22 декабря, 17:11#3

а если машину выключили жёстко, trap же не сработает?

iron_shell
iron_shell
Знаток
сообщений 1050
с июн
1 мая, 08:28#4
Егор Пастухов: если машину выключили жёстко

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

find /var/tmp -maxdepth 1 -name 'sbor.*' -type d -mtime +2 -exec rm -rf {} +

Плюс systemd-tmpfiles на многих машинах уже подметает /tmp сам, а вот /var/tmp живёт дольше и про него забывают.

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

Собрал у себя оба рубежа: trap на выход плюс ночной обход по возрасту. Промежуточное перенёс в mktemp -d, готовый файл теперь уезжает в отдельный каталог.

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

чайник кипит, скрипт бежит