nohup, dtach, screen, tmux — продвинутая магия управления процессами

    •     ,

В прошлый раз я рассказал вам о тех возможностях управления процессами, что предоставляет нам шелл. Сегодня же мы поговорим о приложениях, имеющих значительно более широкие возможности — некоторые из них фактически создают у вас в консоли отдельное рабочее пространство!

nohup

Итак, начнём с самого простого — nohup. Утилита эта принадлежит пакету coreutils, а задача её сводится к тому, чтобы запустить какую-то программу независимо от шелла. Если команда запущена из терминала, то стандартный ввод будет перенаправлен из нечитабельного файла, стандартный вывод — в nohup.out (а если это невозможно — в \(HOME/nohup.out</code>), а stderr — в стандартный вывод. Если хотите, чтобы вывод писался в другой файл, используйте перенаправление: ```\) nohup aptitude -y upgrade >upgrade.txt &

Точно такой же трюк можно проделать и со вводом. На всякий случай повторю: <i>автоматические</i> перенаправления осуществляются только при запуске из <i>терминала</i>! В скриптах, а также в командах типа <code>ssh ХОСТ КОММАНДА</code>, <code>xargs КОММАНДА</code> и прочих все перенаправления придётся выполнять самостоятельно!

Заметьте, что сама по себе nohup не отправляет команду в фон — она нужна скорей для того, чтобы обезопасить себя от неожиданных обрывов связи с терминалом (например, из-за разрыва SSH-соединения или падения иксов :) Поэтому в конец команды можно дописать амперсанд, как сделано в примере выше.

<h1><code>dtach</code></h1>Следующая рассматриваемая программа — <code>dtach</code> — не намного более сложна. В её <code>man</code>-странице написано, что <i>«<code>dtach</code> is a program that emulates the detach feature of <code>screen</code>»</i>, т.е. <code>dtach</code> занимается эмулированием одной-единственной фичи скрина, а именно — созданием отдельных сессий для каждого приложения. Весь смысл в том, чтобы запустить программу под <code>dtach</code>'ем, а потом подключаться к ней, когда необходимо.

Хорошим примером применения данной программы может служить консольный клиент <code>rtorrent</code>: держать ради него постоянно открытый терминал попросту неудобно, а вот запустить приложение под <code>dtach</code>'ем и забыть — это запросто. А когда мне захочется посмотреть рейтинг какого-то торрента или добавить новый, я просто подключусь к уже существующей сессии и выполню все необходимые действия.

Интересной особенностью <code>dtach</code> является то, что он требует явно указать, куда помещать сокет, с помощью которого идентифицируется сессия. Кстати говоря, доступ к сессии целиком и полностью определяется доступом к сокету, так что если вам хочется показать всему народу на мейнфрейме, как круто вы кодите в <code>emacs</code>'е — запускайте <code>dtach</code>, ставьте права на сокет равными <code>644</code> и хвастайтесь на здоровье :)

Специально для тех, кто не любит читать маны — маленький гайд.

Создать сессию с <code>rtorrent</code>'ом внутри (одноимённый сокет поместить в домашнюю директорию):

dtach -c $HOME/rtorrent rtorrent

Насмотрелись? Нажмите <code>Ctrl+\\</code>, и вы покинете <code>dtach</code>. Чтобы заново подключиться к существующей сессии, наберите:

dtach -a $HOME/rtorrent


Собственно, на этом гайд заканчивается — треть возможностей я уже пересказал, а за остальными добро пожаловать в <code>man</code>-страницу (она, кстати, совсем простая и крохотная — по крайней мере, по сравнению со <code>screen</code>'овской :).

Ну что же, простые решения мы рассмотрели — настало время гигантов. Начнём, пожалуй, со <code>screen</code>'а.

<h1><code>GNU screen</code></h1>Эта утилита позволяет пользователю создавать сессии, в каждой из которых может быть по нескольку окон, в каждом из которых выполняется отдельное приложение. Окнами можно управлять, причём не только открывать и закрывать, но и располагать их на экране — в частности, поддерживается горизонтальный и вертикальный сплиттинг. Фактически это целый оконным менеджер в консоли.

<div class="center">
<img src="/images/screen-mutt.png"
    width="724px" height="412px"
    loading="lazy"
    alt="Mutt inside Screen"
    class="bleed" />
</div>

Всех возможностей <code>screen</code>'а и не пересчитать — это крупный (чтобы не сказать монструозный) проект. В рамках же данной статьи я зацеплю только основы — а именно создание сессий и управление окнами.

Итак, для создания новой сессии вам достаточно просто запустить <code>screen</code>:

screen

Но т.к. в этом случае сессия получит невразумительное имя вида <code>PID.номер_терминала.имя_машины</code> (например, <code>21701.pts-2.speedy</code>), то полезным будет указать ключик <code>-S</code>:

screen -S test

Сразу после запуска вам покажут краткую справку по <code>screen</code>. Она вам быстро надоест, так что советую прописать в <code>~/.screenrc</code> такую строку:

startup_message off

После справки вы увидите шелл, откуда можно запускать любое приложение. Чтобы отключиться от <code>screen</code>'а, нужно последовательно нажать две комбинации клавиш — сначала <code>Ctrl+a</code>, а потом <code>Ctrl+d</code>.

Сразу же сделаю маленькую ремарку касательно хоткеев: <code>Ctrl+a</code> означает, что следующий хоткей будет передан <code>screen</code>'у, а не программе, запущенной в текущем окне. Если хотите передать <code>Ctrl+a</code> именно программе, нажмите эту комбинацию дважды.

Итак, вы отключились от сессии. Чтобы подключиться снова, наберите:

screen -r test

Список доступных сессий можно посмотреть с помощью следующей команды:

screen -ls

Теперь перейдём к окнам. Сразу скажу, что не буду затрагивать разбиение экрана на несколько частей, передвижение и ресайз окон — я в этом пока что не разобрался, да и особой потребности нет, ведь всё работает и так.

Новое окно создаётся с помощью комбинации <code>Ctrl+a c</code>. Чтобы переключиться на какое-то другое окно, у вас есть три пути:

* <code>Ctrl+a n</code> переключит вас на следующее окно, <code>Ctrl+a p</code> — на предыдущее

* <code>Ctrl+a "</code> покажет вам список всех доступных окон; вы можете выбирать окно с помощью стрелочек (<code>Up/Down</code>) или указать его номер, а потом перейти на него, нажав <code>Enter</code>

* если вы помните номер окна, вы можете нажать <code>Ctrl+a номер</code> и сразу перепрыгнуть туда

<div class="center">
<img src="/images/screen-list-of-windows.png"
    width="724px" height="412px"
    loading="lazy"
    alt="Screen: list of windows"
    class="bleed" />
</div>

И последняя фича, касающаяся окон — их переименование: нажмите Ctrl+a A и наберите новое имя окна. Задав окнам имена, вы упростите навигацию по вышеупомянутому списку.

Ну что же, на этом ликбез по <code>screen</code>'у считаю оконченным — всё остальное вы можете прочесть в мане и разнообразных howto/manual/tutorial.

<h1><code>tmux</code></h1>Наконец, завершающий этап нашего разговора — <code>tmux</code>. Он разрабатывался как альтернатива <code>screen</code>'у, лицензированная под BSD. Возможности у <code>tmux</code>'а примерно такие же, как и у конкурента от GNU — программа умеет создавать отдельные сессии, в каждой из которых может быть произвольное количество окон с отдельными программами. Дабы не растекаться мыслью по древу, перейдём сразу к практике.

<div class="center">
<img src="/images/tmux-mutt.png"
    width="724px" height="412px"
    loading="lazy"
    alt="Mutt inside Tmux"
    class="bleed" />
</div>

Итак, новая сессия создаётся так же, как и в <code>screen</code>'е, т.е. простым запуском <code>tmux</code>'а:

tmux

К сожалению, именовать можно только сокеты, а сами сессии задаются номерами. Просмотреть доступные сессии можно командой:

tmux ls

а подключиться к одной из них — вот так:

tmux attach номер ``` Отключится же от сессии можно комбинацией Ctrl+b d.

Поехали дальше. Создать окно можно с помощью Ctrl+b c, переключиться на следующее — Ctrl+b n, на предыдущее — Ctrl+b p. Можно переключаться и как в screen’е — Ctr+b номер. Хоткея для списка окон нету, да он и не нужен — он успешно заменён inline-списком внизу страницы. Переименование окна осуществляется с помощью Ctrl+b ,.

Собственно, на этом рассказ о tmux’е можно завершить — основы я дал, а всё остальное вы и сами можете выучить ;)

Такие дела — не одним шеллом богаты :) Спасибо Павлу Вьязовому за подсказку касательно tmux — автор, к своему стыду, об этой программе только слышал, но никогда не пробовал. Теперь же мой вердикт — она выглядит проще и понятней screen’а :)

Всем удачи и — до встречи!

Апдейт 03.07.2017: в параграф о nohup добавлено уточнение о том, что автоматическое перенаправление происходит только при запуске команды из терминала. Спасибо @ingvarjackal за то, что обратил на это моё внимание.

Comments (migrated from Blogger)

On 2010-05-30T21:41:55.427+03:00, bosha wrote:

Про tmux очень мало. Собственно, даже не написано в чём его плюсы перед screen'ом, а они есть, и не мало =]

On 2010-05-30T22:09:36.418+03:00, muhas wrote:

кто про что, а я опять о своём - я так и не понял в чем принципиальное отличие тмукса от скрина, ну кроме лицензии.
Если к скрину я уже привык и пользую его впостоянку то тмукс даже поплотнее попробывать лень(подгонка конфигов и изучение) ибо оторваться от скрина в процессе всё же не получится. Вот и жду кто же напишет знатное сравнение с плюсами и минусами обоих…
на первый взгляд у тмукс лучше с utf - но это только в описаниях, на практике чего-то я этого "лучше" не заметил - скорее даже наоборот(хотя может чего настроить надо было?)…

On 2010-05-30T22:18:36.990+03:00, Minoru wrote:

2 bosha:
Дык это, я с tmux познакомился только когда сел статью писать :) А вот screen я уже некоторое время юзаю (правда, там мои познания тоже не очень глубоки).

Кстати, ты обещал статью о tmux — а где она?

2 muhas:
я, к сожалению, не в состоянии расписать сравнение tmux и screen, т.к. ни тем, ни другим достаточно хорошо не владею.

On 2010-05-31T13:02:26.933+03:00, bosha wrote:

2Minoru

Да, я помню что обещал) У меня экзаменов куча, поэтому я не успел дописать. Планировал на следующий день после твоего предыдущего поста, но не срослось..

2muhas

Подожди чуть чуть. Я допишу на днях пост про tmux)

On 2010-05-31T14:01:05.622+03:00, Minoru wrote:

> экзаменов куча
Помнится, anjolio, автор Linux is Easy, сказал, что именно во время сессии студентов тянет поэкспериментировать с Линуксом :) Тогда не поверил, а сейчас вот постоянно убеждаюсь — таки да, когда по учёбе завал, так и тянет что-то поковырять и поразбираться.

On 2010-05-31T16:32:29.810+03:00, muhas wrote:

@bosha а у тебя как со скрином? а то просто получается как и муска с крысоядом - те у кого есть желание написать знают либо одно либо другое, но никак не вместе, так что какого-то сравнения не получается, а на базовом уровне монопенисуально…

On 2010-06-01T00:59:35.896+03:00, bosha wrote:

@muhas Два года использования скрина достаточно? =]

Я кстати, свалил на tmux. Он мне кажется более удобным && фичастным =)

@Minoru

Я бы не сказал. Мне не до постов сейчас. Я этот пост откладывал уже около месяца..

Кстати пост таки дописал - http://the-bosha.ru/2010/06/01/terminal-window-manager-tmux/

On 2010-10-03T14:55:04.972+03:00, Анонимный wrote:

> Хоткея для списка окон нету…

Ctrl + b, w

Your thoughts are welcome by email
(here’s why my blog doesn’t have a comments form)