Как сделать так, чтобы команда продолжала выполняться после закрытия терминала и ssh-сессии

В ходе настройки самосборного NAS-сервера (смотри предыдущие посты: сборка системы и установка openmediavault) пришлось столкнуться с тем, что при подключении по ssh и выполнении долгих команд любой обрыв связи, закрытие крышки ноутбука, закрытие окна терминала или всё прочее приводило к завершению ssh-сессии и, соответственно, предыванию выполняющейся команды.

Да, обычное поведение такое: если соединение по ssh рвётся, то прерываются все операции. Разве это плохо? Ну, конечно! Есть куча продолжительных операций, в ходе выполнения которых терять коннект никак не хочется:

  • сборка и синхронизация RAID-массива — может занять часов десять
  • форматирование файловой системы массива — часов 20 и больше
  • перенос информации с временного накопителя на основной диск — зависит от объёма, но терабайт данных перекидывается очень неспешно, знаете ли

Короче, задача есть. И есть решение. Нам просто нужно to go deeper.

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

Для этого есть множество решений. Например, screen. Он для меня не подошёл, так как пытался скачаться с какого-то мутного источника, который у меня не открылся. Тогда можно использовать tmux — разветвитель терминалов. В нём можно делать всякие штуки и разбивать рабочее пространство на несколько панелей терминалов. Но меня интересует только один: терминал в терминале, который не закроется при обрыве или отключении от ssh.

Что делаем:

Устанавливаем tmux: sudo apt-get install tmux

Запускаем tmux.

В нём запускаем долгую команду.

Покидаем сессию без закрытия: для этого жмём ctrl+b (это типа вызов менюшки тмукса, хотя на экране ничего не происходит), а затем d (detach — отцепиться).

Ура, мы вышли в терминал, который можно закрыть и идти спать.

А как вернуться в наш оставленный шелл с долгоиграющей командой внутри? Запускаем tmux attach и прицепляемся к последней сесии, где команда продолжает выполняться.

Tmux — прикольная софтина и довольно многофункциональная. Правда, на маке не все комбинации работают с ctrl+b, особенно с курсорными стрелками (конфликтуют с глобальными сочетаниями в MacOSX), но детачить-аттачить сессию можно без глобальных перенастроек горячих клавиш. Ура!

Лучше маленький лайк и репост, чем большое спасибо в комментах. По этой причине комментарии выключены, а кнопки репостов — вас ждут. Пользуйтесь, прошу :)