В SSH-клиенте пропала связь, а в терминале осталась незавершённая команда xcodebuild? По обрыву SSH нельзя определить, остановилась ли сборка: на удалённом Mac отдельно проверьте доступность хоста, процесс сборки и сохранённый результат. Для задач, к которым нужно вернуться после закрытия терминала, запускайте сборку внутри сессии tmux.
Подходит: разработчикам и CI-инженерам, которым нужно запускать и проверять длительную сборку Xcode на удалённом Mac.
Не подходит: тем, кому нужна гарантированная автоматическая перезагрузка или продолжение сборки после сбоя системы: tmux этого не обеспечивает.
Эта статья для независимых разработчиков, которые работают через SSH из нестабильной сети.
Она также пригодится CI-инженерам, отлаживающим сборку вручную, и специалистам по эксплуатации удалённых Mac.
Что именно отключается при обрыве SSH
SSH-клиент, оболочка терминала, сессия tmux, процесс xcodebuild и сам Mac — разные компоненты. Если пропало сетевое соединение, клиент не может показать происходящее на сервере. Это ещё не означает ни остановку команды, ни её успешное завершение.
Инструмент xcodebuild предназначен для запуска операций Xcode из командной строки: среди них сборка проекта и запуск тестов. Это подтверждает назначение инструмента, но не устанавливает, как конкретная команда поведёт себя после закрытия SSH-сеанса. Для параметров и назначения инструмента сверяйтесь с документацией Apple по средствам командной строки Xcode.
Важны обстоятельства разрыва:
| Что произошло | Что можно заключить | Что проверить |
|---|---|---|
| Сеть между компьютером и Mac прервалась | Известно только, что SSH-клиент потерял связь | Повторно подключиться, проверить процесс и журнал |
| Терминал закрыли или оболочка завершилась | Поведение команды зависит от её запуска и реакции на завершение оболочки | Состояние процесса, сессии tmux и результат |
| Команда получила сигнал завершения | Сборка могла быть остановлена, но одного факта разрыва недостаточно, чтобы это установить | Журнал, код завершения, наличие результата |
| Удалённый Mac недоступен | Причина может быть в сети или состоянии хоста | Доступность Mac и состояние системы; не делать вывод о сборке по SSH |
Поэтому повторное подключение к серверу — только первый шаг. Оно не доказывает, что старая сборка ещё работает: новая SSH-сессия открывает отдельный терминал. И наоборот, отсутствие вывода в прежнем окне не доказывает, что процесс завершился.
Первичная проверка после повторного подключения
Подключитесь по SSH к тому же Mac, где запускался проект. Если соединение не устанавливается, сначала выясните, доступен ли хост: проверка процесса не имеет смысла, пока новая оболочка не работает на нужной машине.
Когда вход выполнен, проверьте, существует ли xcodebuild:
ps -Ao pid,ppid,stat,etime,command | grep '[x]codebuild'
Появление строки может означать, что процесс с таким именем сейчас виден системе. Но это не подтверждает, что сборка продвигается, использует именно нужный проект или завершится без ошибки. Отсутствие строки тоже не сообщает, завершилась команда успешно или была прервана.
Для следующей проверки найдите журнал, если вывод команды сохранялся в файл, и посмотрите на его конец:
tail -n 80 "$BUILD_LOG"
Здесь $BUILD_LOG — путь к файлу, заданный при запуске; это пример переменной, а не универсальный путь Xcode. Если лог не сохранялся, новая оболочка не восстановит прокрутку прежнего терминала. Тогда нужно проверять файлы проекта и доступные результаты, а при недостатке данных повторить сборку с сохранением вывода и статуса.
| Признак | Что он показывает | Чего он не доказывает |
|---|---|---|
Процесс xcodebuild найден |
Процесс существует на момент проверки | Что он активен, исправен или завершится успешно |
| В журнале появляются новые строки | В файл поступает вывод команды | Что все этапы сборки завершатся успешно |
| SSH-соединение восстановлено | Удалённый Mac отвечает на новое подключение | Что прежний терминал или сборка восстановлены |
| Результат или пакет найден | Файл присутствует в ожидаемом месте | Что он соответствует текущему запуску и прошёл проверку |
Сопоставляйте признаки, а не опирайтесь на один из них. Если проект использует отдельный результат тестирования, описание Apple о результатах запуска тестов поможет понять, какой результат нужно открыть и интерпретировать. Команда, код завершения и ожидаемые файлы зависят от проекта и выбранной схемы.
Как отделить сборку от окна терминала с помощью tmux
tmux управляет терминальными сессиями на удалённой машине: сессию можно отсоединить от текущего терминала, а позднее подключиться к ней снова. Это полезно для продолжения работы после потери SSH-клиента, если сама удалённая сессия сохранилась. Такое поведение описано в официальном руководстве tmux и справочнике команд tmux.
Ключевое условие: tmux должен работать на удалённом Mac. Если сессия запущена только на локальном компьютере, она не удерживает удалённую команду.
Перед запуском проверьте, установлен ли tmux на удалённой машине, и используйте принятый в этой среде способ установки. Установка через локальный терминал сама по себе не добавляет программу на сервер. Если tmux отсутствует или использовать его нельзя, не полагайтесь на простое открытое SSH-окно для задач, которые нельзя потерять.
Порядок работы:
- Подключитесь по SSH именно к удалённому Mac.
- Создайте там именованную сессию и перейдите в каталог проекта:
sh tmux new-session -s xcode-build cd "$PROJECT_DIR" - Запустите сборку внутри сессии, сохраняя её вывод и код завершения:
sh xcodebuild -scheme "$SCHEME" -destination "$DESTINATION" \ > "$BUILD_LOG" 2>&1 rc=$? printf '%s\n' "$rc" > "$EXIT_FILE"
$PROJECT_DIR,$SCHEME,$DESTINATION,$BUILD_LOGи$EXIT_FILEнужно заменить значениями, подходящими проекту. Параметры-schemeи-destinationзадают схему и целевое назначение сборки; проверьте их по команде проекта и описанию Apple командной сборки. - Когда команда работает, отсоедините терминал от сессии
tmuxсочетаниемCtrl-b, затемd. Это не то же самое, что завершить оболочку или закрыть сессию. - Проверьте список сессий командой
tmux ls, а затем выйдите из SSH-клиента. - После нового входа подключитесь к нужной сессии:
sh tmux attach-session -t xcode-build - Если сборка уже закончилась, прочитайте журнал и файл с кодом завершения, затем проверьте ожидаемый проектом результат.
| Действие | Пример команды | Как трактовать результат |
|---|---|---|
| Создать сессию на удалённом Mac | tmux new-session -s xcode-build |
Открывается отдельная именованная сессия |
| Отсоединиться, не завершая сессию | Ctrl-b, затем d |
Терминал отсоединяется; проверьте сохранение сессии |
| Посмотреть доступные сессии | tmux ls |
Показывает сессии, существующие в момент проверки |
| Вернуться в сессию | tmux attach-session -t xcode-build |
Восстанавливает отображение этой сессии, если она ещё существует |
Команды и сочетания клавиш проверьте по версии и настройкам установленного tmux: опции конфигурации могут менять поведение сочетаний. Также важно не перепутать отсоединение и завершение. Если закрыть саму сессию или остановить её оболочку, возможность вернуться к прежнему терминалу исчезнет.
Проверка кода завершения, журнала и результата
Для нового запуска желательно заранее сохранять в файлы и журнал, и код завершения. В приведённом примере rc=$? выполняется сразу после xcodebuild, а значение записывается в отдельный файл. Если сначала запустить другую команду, переменная $? уже будет относиться к ней, а не к сборке.
После возвращения в tmux проверьте три вещи:
- Код завершения. Если файл со статусом создан, прочитайте его и сопоставьте с правилами проекта. В приведённом примере он появляется только после возврата команды в оболочку.
- Журнал. Изучите конец файла и, если есть ошибки, соответствующий контекст выше по тексту. Последняя строка сама по себе не всегда объясняет исход.
- Ожидаемый результат. Проверьте именно то, что должен производить проект: результат тестов, пакет или иной артефакт, указанный в сборочном процессе.
| Состояние проверки | Следующее действие |
|---|---|
| Процесс найден, журнал меняется | Дождаться завершения и не объявлять успех до проверки результата |
| Процесса нет, записан код завершения | Сопоставить статус с журналом и выходными данными |
| Процесса нет, файла со статусом нет | Выяснить, завершилась ли оболочка до записи статуса; проверить журнал и артефакты |
Сессии tmux нет, состояние сборки неясно |
Проверить доступные файлы; при необходимости запустить контролируемую сборку заново |
Если процесс уже завершился, но терминал отсоединился раньше записи статуса, файл $EXIT_FILE может отсутствовать. Это не означает автоматически ни успех, ни ошибку. Не объявляйте сборку успешной только потому, что появился файл с результатом: его нужно связать с нужным запуском и проверить принятым в проекте способом. Для тестов учитывайте настройки схемы и плана тестирования; документация Apple по организации тестов и запуску из командной строки описывает связанные возможности.
Границы восстановления после перезапуска и отказа
tmux сохраняет терминальную сессию при отсоединении от неё, но не превращает команду в задачу с автоматическим восстановлением. Если Mac перезагрузился, процесс завершился или система отказала, прежняя сессия может оказаться недоступна. Ни повторный SSH-вход, ни попытка присоединиться к tmux не обеспечивают продолжение сборки с того же места.
Порядок действий при неясном состоянии:
- Убедитесь, что доступен нужный Mac, а не другая машина с похожими учётными данными.
- Проверьте, сохранилась ли сессия
tmux. - Если сессии нет, проверьте процесс, журнал, код завершения и доступные проекту результаты.
- Если хост перезапускался или команда исчезла, выясните состояние системы и возможные причины остановки.
- Решите, запускать ли сборку заново, только после оценки файлов, дискового пространства и состояния проекта.
Недостаток свободного места может мешать записи журналов и результатов или приводить к ошибкам сборки. Проверяйте это по сообщению в журнале и состоянию диска, а не по предположению, что причиной был SSH. Если проекту нужна автоматическая обработка перезапуска, настраивайте и отдельно проверяйте соответствующий механизм выполнения задач; не приписывайте такую функцию tmux.
Не запускайте второй экземпляр сборки вслепую. Сначала проверьте процесс и файлы результата: параллельный запуск может усложнить разбор логов и поведение сборочного процесса.
Выбор способа запуска по требуемому восстановлению
- Если достаточно вернуть отображение работающего терминала после обрыва клиента, и сессия
tmuxна удалённом Mac существует, подключайтесь к ней. - Если сборка должна пережить закрытие SSH, но важнее получить проверяемый отчёт, чем сохранить интерактивный терминал, запускайте её с записью журнала и кода завершения.
- Если требуется автоматическое продолжение после перезагрузки, не считайте
tmuxподходящим решением: нужен проверенный для вашей системы механизм запуска и отдельная логика восстановления. - Если нельзя подтвердить процесс, статус и результат, не отмечайте задачу как успешную. Сначала соберите доступные данные или повторите запуск с сохранением состояния.
Для настройки доступа к удалённой машине можно свериться с руководством HopVM по подключению к Mac. Если проекту нужна длительная среда, заранее определите, как будут храниться журналы и результаты, и включите эти проверки в рабочий процесс.
Частые вопросы
Продолжает ли xcodebuild работу после обрыва SSH?
Обрыв SSH не даёт ответа о состоянии xcodebuild: многое зависит от способа запуска и последствий для удалённой оболочки. После нового подключения проверьте доступность Mac, наличие процесса, сессию tmux, журнал и результат отдельно. Найденный процесс подтверждает только то, что он существует во время проверки, но не то, что сборка завершится успешно.
Как запустить сборку внутри tmux на удалённом Mac?
Сначала войдите по SSH на нужный Mac и создайте именованную сессию tmux там. Запускайте xcodebuild внутри этой сессии, направив вывод в журнал и сохранив код завершения. Затем отсоедините терминал от сессии, не завершая её. Перед закрытием SSH проверьте, что сессия доступна на удалённой машине.
Как вернуться к сборке после повторного SSH-входа?
Проверьте список сессий tmux на удалённом Mac и подключитесь к нужной, если она сохранилась. Если её нет, сначала проверьте процесс xcodebuild и файлы запуска. Не запускайте сборку повторно автоматически: предыдущая команда могла ещё выполняться или уже оставить результаты, которые важно сохранить и проверить.
Как проверить успех или ошибку сборки после разрыва связи?
Используйте сочетание признаков: код завершения, сохранённый вывод команды и ожидаемые проектом результаты. Новый SSH-сеанс не восстанавливает код завершения прежней оболочки, если он не был записан заранее. При отсутствии достаточных подтверждений результат следует считать неопределённым, а не успешным; повторный запуск настройте с сохранением журнала и статуса.
Для длительной сборки важно не только иметь доступ к macOS, но и заранее проверить, подходят ли среда, доступ к проекту и способ сохранения результатов. Локальный Mac удобнее, когда сборки регулярны и нужна физическая машина; арендованная среда не заменит доступ к локальным устройствам и не гарантирует восстановление после сбоя. Но если покупать Mac ради временных сборок нецелесообразно, а текущая Linux-среда не поддерживает нужный инструментарий Xcode, удалённый Mac может закрыть задачу без покупки оборудования. Посмотрите варианты аренды Mac в HopVM и перед длительной работой проверьте на выбранной среде весь цикл: запуск, отключение SSH, повторное подключение и проверку результата.
Часто задаваемые вопросы
Продолжит ли xcodebuild работу, если оборвалось SSH-соединение?
По одному факту отключения SSH определить состояние сборки нельзя. Оно зависит от того, как запущена команда, что произошло с удалённой оболочкой и не получил ли процесс сигнал завершения. Подключитесь заново, проверьте доступность Mac и наличие процесса, а затем отдельно найдите журнал и результат сборки. Не считайте активное соединение или найденный процесс доказательством успеха.
Как безопасно запустить сборку Xcode внутри tmux на удалённом Mac?
Установите SSH-соединение именно с удалённым Mac, создайте там именованную сессию tmux и запускайте xcodebuild из нужного каталога проекта внутри неё. Сохраните вывод команды в файл и отдельно запишите её код завершения. Затем отсоединитесь от сессии средствами tmux, не завершая её, и проверьте, что она осталась доступной перед закрытием клиента.
Как после повторного входа по SSH вернуться к незавершённой сборке?
Сначала проверьте, существует ли нужная сессия tmux, и подключитесь к ней с удалённой машины. Если сессии нет, не запускайте ту же сборку автоматически: сначала выясните, жив ли процесс xcodebuild, что произошло с предыдущей командой и какие файлы результата уже созданы. Повторный запуск без проверки может перезаписать выходные данные или усложнить диагностику.
Как понять, завершилась сборка успешно или с ошибкой во время обрыва связи?
Сверьте несколько независимых признаков: код завершения команды, последние строки сохранённого журнала и наличие результата, который ожидает проект. Если код завершения не был записан до отключения, новый SSH-сеанс не восстановит его автоматически. В таком случае изучите журнал и артефакты, а при нехватке подтверждений повторите сборку с явным сохранением вывода и статуса.
Читайте также
Продолжайте работу над сборками Xcode на удалённом Mac
Арендуйте выделенный физический Mac от HopVM и подключайтесь к нему удалённо по SSH или через графическую сессию.
