[P2][tradein][backend] cron-scrape.sh падает на tee: Permission denied (set -euo pipefail) #758

Closed
opened 2026-05-30 16:05:42 +00:00 by lekss361 · 2 comments
Owner

Проблема

tradein-mvp/deploy/cron-scrape.sh под set -euo pipefail падает на ПЕРВОЙ строке логирования:

tee: /var/log/tradein-scrape.log: Permission denied

log() пишет через ... | tee -a "$LOG" (LOG=/var/log/tradein-scrape.log), а контейнер/cron-юзер не имеет write на /var/log/tee exit≠0 → pipefail валит весь скрипт ДО первого scrape-запроса. Итог: cron avito-скрейп не выполняется вообще (обнаружено resolver'ом при разборе #726 — coverage стоял, потому что cron молча не работал).

Задача

  • LOG по умолчанию → writable путь (напр. ${LOG:-/tmp/tradein-scrape.log} или /opt/gendesign/tradein-mvp/logs/), ЛИБО log() с graceful fallback: | tee -a "$LOG" 2>/dev/null || cat.
  • Проверить что под cron-юзером (тем, что в crontab на проде) скрипт доходит до scrape-цикла.

Files

  • tradein-mvp/deploy/cron-scrape.sh (LOG=стр.29, log()=стр.31-33).

DoD

  • Скрипт не падает на logging под set -euo pipefail у cron-юзера без write на /var/log.
  • Лог пишется в writable путь; scrape-цикл выполняется.

Контекст

Follow-up из #726 (avito listing_date). NB: даже после фикса этого скрипта прод-cron упрётся в #623 (avito egress IP 429) — это два независимых блокера cron-пути.

## Проблема `tradein-mvp/deploy/cron-scrape.sh` под `set -euo pipefail` падает на ПЕРВОЙ строке логирования: ``` tee: /var/log/tradein-scrape.log: Permission denied ``` `log()` пишет через `... | tee -a "$LOG"` (`LOG=/var/log/tradein-scrape.log`), а контейнер/cron-юзер не имеет write на `/var/log/` → `tee` exit≠0 → `pipefail` валит весь скрипт ДО первого scrape-запроса. Итог: **cron avito-скрейп не выполняется вообще** (обнаружено resolver'ом при разборе #726 — coverage стоял, потому что cron молча не работал). ## Задача - `LOG` по умолчанию → writable путь (напр. `${LOG:-/tmp/tradein-scrape.log}` или `/opt/gendesign/tradein-mvp/logs/`), ЛИБО `log()` с graceful fallback: `| tee -a "$LOG" 2>/dev/null || cat`. - Проверить что под cron-юзером (тем, что в crontab на проде) скрипт доходит до scrape-цикла. ## Files - `tradein-mvp/deploy/cron-scrape.sh` (LOG=стр.29, log()=стр.31-33). ## DoD - [ ] Скрипт не падает на logging под `set -euo pipefail` у cron-юзера без write на /var/log. - [ ] Лог пишется в writable путь; scrape-цикл выполняется. ## Контекст Follow-up из #726 (avito listing_date). NB: даже после фикса этого скрипта прод-cron упрётся в #623 (avito egress IP 429) — это два независимых блокера cron-пути.
lekss361 added the
scope/backend
status/ready
priority/p2
tradein
labels 2026-05-30 16:05:42 +00:00
bot-backend self-assigned this 2026-05-30 16:15:41 +00:00
bot-backend added
status/wip
and removed
status/ready
labels 2026-05-30 16:15:50 +00:00
bot-backend added
status/review
and removed
status/wip
labels 2026-05-30 16:22:59 +00:00
Collaborator

PR #776 → status/review. LOG default→/tmp + tee ... 2>/dev/null || true; bash -n clean.

PR #776 → status/review. LOG default→/tmp + `tee ... 2>/dev/null || true`; `bash -n` clean.
bot-reviewer added
status/qa
and removed
status/review
labels 2026-05-30 16:25:24 +00:00
Collaborator

QA PASS (merged-код на main подтверждён через Forgejo file API)

tradein-mvp/deploy/cron-scrape.sh:

  • LOG="${LOG:-/tmp/tradein-scrape.log}" ✓ — writable default (было /var/log/..., недоступно cron-юзеру).
  • log() { echo "..." | tee -a "$LOG" 2>/dev/null || true; } ✓ — graceful fallback: даже если tee упадёт (нет write), || true не даёт set -euo pipefail убить скрипт ДО scrape-цикла.

DoD: скрипт больше не падает на первой строке логирования под set -euo pipefail; лог в writable путь; scrape-цикл достижим. ✓

NB (как и в issue): прод-cron всё равно упрётся в #623 (avito egress IP 429) — независимый upstream-блокер cron-пути, не предмет этого фикса. Этот PR убирает первый из двух блокеров. → status/done, closing.

✅ **QA PASS** (merged-код на `main` подтверждён через Forgejo file API) `tradein-mvp/deploy/cron-scrape.sh`: - `LOG="${LOG:-/tmp/tradein-scrape.log}"` ✓ — writable default (было `/var/log/...`, недоступно cron-юзеру). - `log() { echo "..." | tee -a "$LOG" 2>/dev/null || true; }` ✓ — graceful fallback: даже если `tee` упадёт (нет write), `|| true` не даёт `set -euo pipefail` убить скрипт ДО scrape-цикла. DoD: скрипт больше не падает на первой строке логирования под `set -euo pipefail`; лог в writable путь; scrape-цикл достижим. ✓ NB (как и в issue): прод-cron всё равно упрётся в **#623** (avito egress IP 429) — независимый upstream-блокер cron-пути, не предмет этого фикса. Этот PR убирает первый из двух блокеров. → `status/done`, closing.
bot-qa added
status/done
and removed
status/qa
labels 2026-05-30 16:32:03 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#758
No description provided.