Болевые точки: без присмотра это не копипаст из терминала
Интерактив успешен, демон — нет. Терминал наследует PATH из login-shell, сокет ssh-agent, иногда Touch ID. Задачи launchd и cron не получают этого, пока вы явно не запишете. Типичный вид — зависание после установки TCP или при инкрементальном листинге, а не мгновенный Permission denied.
Залипания openrsync на больших деревьях. Много файлов прошло — и тишина между файлами без кода ошибки. Это не то же самое, что постепенное удушение WAN или явные I/O при переполнении диска. Лечение: флаги протокола, согласование бинарников rsync, разбиение гигантских деревьев на независимые джобы с отдельными логами.
sftp -b ждёт вечно. Неинтерактивный режим не отвечает на prompt; несовпадение прав или опечатка в пути могут повиснуть без stderr, если в plist не настроены лог и -v. Сужайте пакет команд, сначала вручную на той же учётке, что у демона, — это снимет половину ложных «сетевых» эскалаций, которые оказываются копийной ошибкой cd.
Атомарная публикация. Починить rsync без конвейера релиза — значит оставить полуфайлы на виду. Сочетайте статью со staging и checksum-гейтами: успех — проверенные байты, а не только ноль в exit code. Сопоставьте runbook с политикой удержания: если артефакты содержат пути, пригодные для реконструкции внутренних соглашений, хранение и маскировка в логах и метриках должны совпадать с DLP и внутренним регулированием, иначе инцидент-менеджмент наткнётся на новый риск.
Слои: среда и стек протокола
L0 — ssh с BatchMode=yes в том же пользователе, что и джоб. Пока здесь ломается, rsync не трогаем. L1 отделяет залипание при построении списка от залипания в середине байтового потока. L2 — совместимость openrsync с удалённым rsync, --rsync-path, при необходимости --protocol=28.
Для launchd проверьте UserName, WorkingDirectory, stdout/stderr. Разница LaunchDaemon и LaunchAgent влияет на связку с keychain. Для безлюдных путей — отдельные CI-ключи без пароля и учётные записи только на upload на принимающем Mac.
Самохостные раннеры GitHub Actions добавляют свой PATH и HOME: обёртка печатает id и pwd в начале, чтобы инцидент опирался на факты.
Несколько команд на одном входе — комбинируйте runbook с лимитами параллелизма: ретраи одной команды не должны добивать sshd, пока другая считает checksum.
Расширенный PATH в plist часто безопаснее неявного наследования. Ограничьте обёртку правами 750 и отдельным сервисным аккаунтом.
Если openrsync иногда нуждается в трёх попытках на снимок, закладывайте запас параллелизма; иначе три пайплайна в одну минуту превратят редкий хвост в аварию. Централизованные учётки CI на общем сегменте увеличивают риск одновременных рукопожатий и пиков I/O, пока sha256 или codesign конкурируют с потоковым rsync; моделируйте это в SLO, а не только «секундой на мегабайт» в лаборатории.
Дополните матрицу сетевым сценарием: корпоративный прокси, split-DNS, TLS-терминация и региональные требования к логам с персональными путями влияют на то, куда пишет обёртка и какие метаданные попадает в long-term storage; это не дублирует, а дополняет чисто openrsync-уровневую диагностику.
Метрики: секунды простоя, не ощущения
До смены флагов соберите сутки эталона: начало, конец, число файлов, байты, коды выхода, секунды без движения байт. Без прогресса дольше ~300 с — timeout и алерт. Коррелируйте RTT и потери, чтобы не принять L2 за L0.
В CI успех из трёх фаз: транспорт завершён, checksum совпал, атомарно переключён указатель; у каждой свой смысл exit code — тогда ретраи openrsync видны как доля, а не шум 0/1.
Руководству отвечайте гистограммами, не байками. Длительности залипаний после выравнивания протокола показывают редкий хвост или регрессию на миноре Sequoia.
Обновляйте baseline после каждого точечного релиза Apple: встроенные инструменты меняются незаметно, и джоб, переживший пятнадцать патчей, внезапно ломается.
Для финансов: десять минут ночного простоя на двадцать инженеров — это скрытая стоимость внимания, часто выше, чем закрепить GNU rsync на обоих концах.
Сезонность: конец квартала сжимает загрузки и вскрывает скрытые гонки; схема, прошедшая февраль, может рухнуть в декабре без синтетической нагрузки.
Одностраничная эскалация: 1) логи plist, 2) BatchMode ssh, 3) версии rsync, 4) NAT/файрвол — чтобы дежурные не параллелили противоречивые эксперименты. Для планов хранения фиксируйте, сколько дней остаётся в разделяемом пуле, если пути в логах косвенно указывают на тенантов, и согласуйте это с DLP и политикой маскировки, чтобы post-mortem не превращался в нарушение приватности.
Микрорелизы Sequoia меняют неочевидные детали вокруг ssh и системных путях: повторяйте baseline и после «безликого» security update, иначе стабильный сценарий внезапно начнёт ретраиться чаще — как редкое пуассоновское событие, так и каскадный регресс, пока никто не меряет квантиль хвоста.
Привязывайте метрики к бизнесу: срыв nocturne-сборок для двух дюжин разработчиков съедает больше, чем лицензия на пин-версии GNU rsync в контейнерах CI, если сравнивать в часах дежурства, а не только в токенах API.
Матрица: первые действия
| Симптом | Вероятная причина | Первый шаг | Риск |
|---|---|---|---|
| Висят только демоны | PATH, нет сокета агента, нет TTY | Явный PATH, ключи заранее, жёсткий BatchMode | Широкие env разных plist конфликтуют — изолируйте джобы |
| Середина дерева | Сдвиг пары openrsync | --protocol=28, --rsync-path к GNU | Неверный путь на дальнем конце — быстрый fail; сначала staging |
| Тихий SFTP batch | Prompt или права | -v, дробление батчей, явный bye | Подробные логи могут светить пути — маскируйте архивы |
| Флаки после обновления ОС | Дрейф toolchain | Перезакрепить версии rsync, прогнать baseline | Два бинарника — временный рост поддержки |
Семь шагов
#!/bin/bash
set -euo pipefail
export PATH="/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export RSYNC_RSH="ssh -o BatchMode=yes -o ServerAliveInterval=30"
/usr/bin/rsync -av --protocol=28 --rsync-path=/opt/homebrew/bin/rsync \
./artifacts/ "[email protected]:/data/inbox/staging/"
1: id, pwd, отфильтрованный env в контексте plist.
2: ssh -o BatchMode=yes -o ConnectTimeout=10 до rsync.
3: согласовать реализации rsync, зафиксировать --rsync-path в доке.
4: отдельный CI-ключ или управляемый ssh-agent, без интерактивного ввода пароля.
5: timeout, ограниченный backoff, порядковый номер ретрая.
6: dry-run на staging, затем атомарные шаги релиза.
7: ежемесячные сводки ретраев и хвостовой задержки, политика ротации логов.
Квартально: убить rsync в середине переноса — гейты должны пометить билд плохим. Перезагрузка раннера в процессе — стресс для агента и хвостов полуфайлов. Обёртка в том же git, что и pipeline. Юридически требуется пароль на ключе — внедрите одобренный путь разблокировки без TTY. Разведите людские и машинные ключи на границе учёток.
Ночной сценарий, где launchd гасит сервис посреди передачи байт, — отдельный стресс-тест: бюро метрик обязано отличать залипание openrsync от сетевого флапинга, иначе одна и та же тихая категория алертов спрячет две независимые неисправности. Документация по правам: если BatchMode временно снимают вручную при расследовании, playbooks фиксируют, что это нарушение SOP, иначе GPG-консоль и автоматика войдут в конфликт с предсказуемым сценарием деградации.
Ротация логов как у приложения: диск, заполненный логами, нередко маскировали под «баг openrsync». Каждый флаг — владелец и строка причины в репо. --protocol=28 в личном gist-репо исчезает вместе с переводом в другую команду: держите флаги в релевантном git с кратким обоснованием, чтобы аудит и безопасность не спорили, это долгий техдолг или вынужденная несовместимость. Пул Intel и Apple Silicon: разные префиксы Homebrew, разные --rsync-path и отдельные тесты на обе ветки; ползучая деградация «половина флотилии зелёная» путает дашборды, когда путь hardcode под один префикс. Дрилл: убрать GNU rsync из staging и убедиться, что аларм срабатывает на откат к немитигированному openrsync, иначе SLO-дыра останется невидимой до пятничного релиза. Имена: label plist, префикс логов, серия Grafana — один токен, чтобы в три часа ночи обойтись без толкователя терминов в чате.
Читать дальше
Параллелизм и keepalive: параллельный SFTP. Плотные циклы CI: ControlMaster. Изоляция: chroot SFTP и команды и права. Главная — обзор входа. Multiplexing не чинит залипание листа файлов openrsync — в постмортемах фиксируйте слой. Общий Mac — общая I/O-очередь: SLA с учётом ретраев.
Самостоятельный владелец инфраструктуры тащит весь жизненный цикл «железа», микрорелизы macOS, смещения plist, проект мультитенантных прав. Когда накопленные затраты на опору сравнимы с ценой выделенного входа, облако артефактов с заранее зафиксированными дефолтами сокращает длительность инцидентов: меньше сопоставления вручную «чей plist», «какой Homebrew» и «почему openrsync снова рестартовали вместо разбора причины».
Телеметрия, завязанная на соглашения об именах, даёт сопоставимый ряд для безопасности и SRE, особенно если внешний аудит читает те же панели, а не пятнадцать разбросанных gists. Для поставок с пересечением границ данных проверяйте, не «проливаются» ли пути в логах через центральные коллекторы, если в один лог-агрегатор сходятся десятки внутренних арендаторов.
FAQ и хостинг
Нужно ли запрещать системный rsync целиком?
Нет тотального запрета. Мелкие локальные копии могут жить на системном инструменте. Удалённо, много файлов, без TTY — закрепите GNU rsync и версии в доке.
А cron в 2026?
Apple предпочитает launchd. Если cron остаётся, считайте минимальную среду нормой и явно пропишите PATH и обёртку.
Резюме: на Sequoia без присмотра нужны явные PATH и ssh-agent, детерминированный BatchMode ssh, согласованные rsync, таймауты и ступенчатый релиз.
Ограничение: runbook не заменяет проектирование сети dual-stack или корпоративного прокси — отдельные L0-программы.
Контраст: предложения SFTPMAC упаковывают стабильный вход, границы прав и дефолты эксплуатации: меньше ночей на сверку plist с рестартами openrsync, владение пайплайном остаётся у команды. Часто дешевле, чем кормить домашний узел, когда дежурство на вес золота. Долговечные процессы важнее разовой «тренировки» openrsync: критично, что происходит, когда в инциденте сознательно снимают BatchMode вручную, и почему playbooks всё равно запрещают это как постоянный обход, иначе GPG-консоль и ночной rsync-контур начнут взаимно мешать.
Долгосрочная согласованность: заполнения и стресс-тесты пустыми каталогами и деревьями на миллионы файлов дают цифры усталости, но не снимают вопрос о том, как ваша учётка CI соседствует с чужой нагрузкой sha256 на том же хосте. Закрепляйте в SLO сценарии, где плотные короткие джобы не размазывают рукопожатия, но и где залипание списка файлов не путают с вечным TCP. Бюджет часов дежурства на квартал стоит пересчитать в деньгах до обсуждения «экономии» на закреплении бинарников.
