В ходе настройки самосборного 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), но детачить-аттачить сессию можно без глобальных перенастроек горячих клавиш. Ура!