Как скрыть терминал linux

IgorKa — Информационный ресурс

Немного обо всем и все о немногом, или практический опыт системного администратора.

Июнь 2010
Пн Вт Ср Чт Пт Сб Вс
« Май Июль »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Как отвязать процесс от терминала в Ubuntu

В лекции посвященной процессам и задачам в bash преподаватель рассказал нам о команде nohup, которая может защитить процесс от сигнала SIGHUP, который посылает своим дочерним процессам, процесс-родитель, когда завершает свою работу. Когда из текстовой консоли Linux или графического терминала (gnome-terminal) запускается команда, которая работает в фоне, то при закрытии терминала или выходе из консоли, команда также прекратит свою работу.

Если ближе к практике, то речь идет о следующем. Проведем эксперимент. Запускаем графический терминал (gnome-terminal) и пишем в нем команды:

В результате будут запущены два графических приложения: калькулятор и редактор. Теперь закроем терминал нажав на кнопку закрытия (”крестик”). Как видите вместе с терминалом завершили работу и приложения запущенные из него. Снова открываем терминал и пишем такие команды:

$ nohup: ввод игнорируется, вывод добавляется в `nohup.out’

Здесь нажимаем Enter, чтобы вернуть приглашение терминала и пишем далее:

$ nohup: ввод игнорируется, вывод добавляется в `nohup.out’

И также нажимаем Enter. Теперь снова закрываем терминал, нажав на “крестик”. Теперь приложения остались работать и не закрылись. Команду nohup можно использовать, но есть приложения с которыми она не срабатывает. Например, браузер Opera. Набрав, nohup opera & и закрыв терминал, Opera также завершит свою работу.

В оболочке bash есть встроенная команда, которая больше подходит для требуемой задачи. Это команда disown. Приложения запущенные в терминале в фоне (приложения запущенные со знаком &), являются задачами или заданиями (jobspec в мане), которые формируют таблицу заданий. При выходе из терминала bash просматривает эту таблицу и посылает всем заданиям сигнал SIGHUP. Команда disown занимается тем, удаляет задания из таблицы заданий. Посмотреть информацию о команде disown можно в справке man bash. На всякий случай процитирую здесь фрагмент из справки:

disown [-ar] [-h] [jobspec . ]

Without options, each jobspec is removed from the table of active jobs. If jobspec is not present, and neither -a nor -r is supplied, the shell’s notion of the current job is used. If the -h option is given, each jobspec is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If no jobspec is present, and neither the -a nor the -r option is supplied, the current job is used. If no jobspec is supplied, the -a option means to remove or mark all jobs; the -r option without a jobspec argument restricts operation to running jobs. The return value is 0 unless a jobspec does not specify a valid job.

Дальше несколько примеров. Открываем терминал и пишем команды:

Команда jobs в третьей строке показывает, что в таблице заданий находится задание под номером 1. Команда disown %1 убирает это задание из таблицы. Следующей командой jobs проверяем, что действительно в таблице теперь нет заданий. После этого закрываем терминал и видим, что редактор gedit работает.

С ключом -h задания не будут удалятся из таблицы, но сигнал SIGHUP все равно обрабатывать не будут. Закроем gedit и выполним команды еще раз:

Как видите задание осталось, в таблице, но если закрыть терминал, то все равно gedit будет работать. Запущенная без параметров команда disown удалит из таблицы заданий все задания. Дальше можете поэкспериментировать сами.

Также хочу добавить, что если из графического терминала в Ubuntu выходить по команде exit, то запущенные из терминала приложения останутся работать и без команд nohup или disown.

Чуть не забыл о браузере Opera 🙂 С командой disown все работает так как нужно. То есть для того чтобы опера не закрывалась после закрытия графического терминала нужно после запуска команды выполнить команду disown:

Теперь если нажать на “крестик”, то после закрытия терминала, браузер будет работать.

Источник

Как закрыть терминал без убийства запущенной в нём команды

Иногда нужно «отвязать» программа от окна терминала, в котором она запущена. Например, вы подключились к удалённому серверу по SSH, запустили задачу, которая не является демоном, но выполнение которой требует большого времени (может быть дни и месяцы). Если вы закроете терминал или просто оборвёте SSH сессию, то запущенная программа попросту прекратит свою работу.

Ещё один пример ситуации, когда это может понадобиться, вы работаете с безголовым сервером (без графического окружения рабочего стола) и по этой причине не можете открыть несколько терминальных окон. Поэтому вы хотите перевести программу в фон, чтобы продолжить работу с терминалом.

В этой статье описаны варианты, как закрыть терминал без остановки запущенной в нём программы.

Для этого есть два решения:

Давайте разберёмся, а в чём различия между

Давайте для начала взглянем, что происходит, когда команда запускается из интерактивной оболочки (подключённой к терминалу) без & (и без какого либо перенаправления). Поэтому давайте предположим, что вы напечатали просто foo (в качестве примера команды), тогда:

  • Создаётся процесс foo.
  • Процесс наследует stdin (стандартный ввод), stdout (стандартный вывод), и stderr (стандартный вывод ошибок) из оболочки. Следовательно, он также подключён к тому же терминалу.
  • Если оболочка получает SIGHUP (сигнал, посылаемый процессу для уведомления о потере соединения с управляющим терминалом пользователя), она также отправляет SIGHUP процессу (что обычно приводит к завершению процесса).
  • В противном случае оболочка ожидает (является заблокированной) пока процесс завершиться.

Теперь давайте посмотрим, что происходит, когда мы переводим процесс в фон, это делается набором foo &:

  • Создаётся запущенный процесс foo.
  • Процесс наследует stdout/stderr из оболочки (поэтому он всё ещё пишет в терминал).
  • Процесс, в принципе, также наследует stdin, но как только он пытается читать из stdin, он приостанавливается.
  • Он помещается в список фоновых задач, которыми управляет оболочка, что в частности означает:
  • Он выводиться по jobs и к нему можно получить доступ используя %n (где n – это номер задачи).
  • Его можно перевести на задачу переднего плана, используя fg, в этом случае он продолжится, будто бы вы не использовали с ним & (и если раньше он останавливался, при попытке читать стандартный ввод, теперь он может работать с чтением стандартного ввода из терминала).
  • Если оболочка получает SIGHUP, она также отправляет SIGHUP процессу. В зависимости от оболочки и возможных включённых опций оболочки при завершении оболочки она также будет отправлять процессу SIGHUP.

Теперь disown удаляет задачу из списка задач оболочки, следовательно все приведённые выше подпункты больше не применяются (включая отправку оболочкой процессу сигнала SIGHUPl). Тем не менее, помните, что он всё ещё подключён к терминалу, поэтому если терминал разрушен (что может случиться если это был pty, как те, которые создаются xtermor или ssh, и контролирующая программа завершена закрытием xterm или закрытием SSH-подключения), программа потерпит неудачу, как только она попытается прочитать из стандартного ввода или записать в стандартный вывод.

Что делает nohup, с одной стороны, она активно отделяет процесс от терминала:

  • Она закрывает стандартный ввод (программа будет неспособна читать любой стандартный ввод, даже если она запущена на переднем плане. Она не закрывается если не получает сообщение об ошибке или EOF).
  • Она перенаправляет стандартный вывод и стандартный вывод ошибок в файл nohup.out, поэтому программа не потерпит неудачу во время записи в стандартный вывод если терминал потерпит неудачу, то чтобы процесс не писал, это не будет потеряно.
  • Она не даёт процессу получить SIGHUP (отсюда и её имя).

Помните, что nohup не удаляет процесс из контроля задач оболочки и также не переводит его в фон (но поскольку задача nohup на переднем плане практически бесполезно, то обычно она запускается с использованием &). Например, в отличие от disown, оболочка всё ещё будет говорит вам, когда задача nohup завершена (конечно, если оболочка не закрылась раньше этого).

  • & переводит задачу в фон, это приводит к блокировке попыток читать стандартный ввод и делает так, что оболочка не ждёт завершения задачи.
  • disown удаляет процесс из контроля задач оболочки, но всё ещё оставляет её связанной с терминалом. Одним из результатов этого является то, что оболочка не отправит SIGHUP. Очевидно, что это может быть применимо только к фоновым задачам, поскольку вы не можете ввести это когда запущена работа на переднем плане.
  • nohup отсоединяет процесс от терминала, перенаправляет его вывод в nohup.out и предохраняет его от SIGHUP. Одним из эффектов (в честь которого и названа команда) является то, что процесс не получит любой отправленный NOHUP. Он абсолютно независим от контроля задач и может, в принципе, использоваться для задач на переднем плане (хотя это не особо полезно).

Если использовать вместе все три disown, nohup и &, то процесс будет запущен в фоне, удалён из контроля задач оболочки и эффективно отключён от терминала.

nohup выполняет КОМАНДУ игнорируя сигналы обрыва терминальной линии.

Возможные опции nohup:

Если стандартный ввод является терминалом, то он берётся из нечитаемого файла.

Если стандартный вывод является терминалом, то вывод добавляется в «nohup.out», если возможно, иначе в «$HOME/nohup.out».

Если стандартный поток ошибок является терминалом, то он перенаправляет в стандартный вывод. Чтобы записать вывод в ФАЙЛ, используйте «nohup КОМАНДА > ФАЙЛ».

ЗАМЕЧАНИЕ: ваша оболочка может предоставлять свою версию nohup, которая обычно перекрывает версию, описанную здесь. Пожалуйста, обращайтесь к документации по вашей оболочке, чтобы узнать, какие ключи она поддерживает.

Источник

Как пользоваться screen для управления терминалами Linux и отсоединения процессов от терминала

Что такое screen

Screen — это программа для «уплотнения» (мультиплекса) физических консолей. Суть в том, что несколько процессов (как правило интерактивных шеллов) могут работать в одном окне консоли. То есть эта программа позволяет пользователю иметь несколько экземпляров терминалов внутри одного терминала этого менеджера окон. Речь идёт не о вкладках, а о перемещении терминалов в фон. Одним из эффектов работы screen является то, что при закрытии окна терминала, процесс продолжает работу.

Приложение screen очень полезно если вы имеете дело с несколькими программами из интерфейса командной строки, а также для отделения программ от оболочки терминала. Она также позволяет вам делиться вашими сессиями с другими пользователями и отсоединять/подсоединять сессии терминала.

Как установить screen

На некоторых системах пакет screen может быть уже установлен. Если у вас его нет, то установите его.

На Debian, Linux Mint, Ubuntu, Kali Linux и их производных:

На RedHat и производных:

На Arch Linux, BlackArch и их производных:

Чтобы установить screen на Solaris:

На самом деле, screen это очень полезная команда в Linux которая может пригодиться при различных обстоятельствах. Давайте начнём знакомство с функциями screen.

Запуск screen в первый раз

Просто наберите screen в приглашении командной строки:

Будет выведена информация о программе — нажмите ENTER, чтобы её скрыть. Затем приглашение командной строки вернётся в точно такое же, как было и ранее.

Справка по параметрам screen

Когда вы вошли в screen, вы можете делать вашу обычную работу как будто бы вы в обычном окружении командной строки. Программа screen расширяет функциольность за счёт своих команд (параметров).

Нажмите Ctrl-A, а затем ? (то есть Shift+/). Затем вы увидите все команды (параметры) screen.

Чтобы выйти из экрана справки, нажмите Пробел или Enter.

Отсоединение процесса от консоли в screen

Одним из преимуществ screen является возможность отсоединить от консоли процесс, который запущен внутри screen. Далее вы можете даже закрыть консоль (или отключиться от SSH) — процесс всё равно продолжит свою работу. Затем вы можете восстановить окно консоли — вы увидите, что программа всё это время работала и её данные не потеряны.

Пример сценария: вы работаете по SSH на вашем сервере. Вам нужно запустить программу, выполнение которой требует много времени. Это может быть скачивание большого патча для системы с помощью wget или любая длительная команда. В качестве примера я возьму обычный ping. Предположим мне нужно проверить качество связи с помощью ping на протяжении двух часов. Если я отключусь от SSH или связь будет потеряна случайно, то тогда процесс выполнения команды в консоли будет остановлен и нужно будет вновь начинать сначала. Чтобы этого избежать, мы можем использовать screen для отсоединения процесса от консоли.

Рассмотрим на примере конкретных команд.

Вначале входим в screen:

Затем я запускаю пинг:

В процессе работы программы, мы можем нажать Ctrl-a и d. Вывод от программы прекратиться, мы увидим примерно следующую информацию:

Повторное подсоединение консоли с запущенным процессом к screen

После отсоединения процесса и закрытия screens, вы можете отключиться от сервера, то есть закрыть SSH сессию и заняться другими делами. Затем вы можете подключиться к SSH снова — причём, возможно даже с другого компьютера. После этого вы можете увидеть прогресс выполнения вашего процесса (пинг, загрузка, что угодно). Чтобы это сделать, нужно восстановить screen. Для этого запустите следующую команду:

И вы увидите, что процесс, который вы здесь оставили, всё ещё запущен.

Когда у вас больше чем одна сессия screen, то вам нужно будет ввести ID (идентификатор) сессии screen. Используйте screen -ls чтобы показать, как много сессий доступно:

Если вы хотите восстановить сессию screen 13786.pts-2.HackWare, тогда наберите следующую команду:

Использование нескольких screen

Когда нужен больше чем один screen для выполнения работы, это возможно? Да, можно одновременно работать с несколькими screen. Вы можете запустить несколько окон screen одновременно — есть два способа сделать это.

Во-первых, вы можете отсоединить первый экран screen для запуска другого screen в реальном терминале.

Во-вторых, вы можете делать вложенные экраны screen.

Переключение между экранами

Когда вы делаете вложенные screen, вы можете переключаться между ними используя команду Ctrl-a и n. В этом случае вы перейдёте к следующему окну screen. Когда вам нужно перейти к предыдущем screen, то просто нажмите Ctrl-a и p.

Для создания нового окна screen нажмите Ctrl-a и c.

Как записать все действий в терминале

Иногда важно сохранить все действия в терминале, которые вы выполнили находясь в консоли, то есть вести журнал (логи) активности в консоли.

Допустим вы администратор Linux, который управляет множеством серверов Linux. С ведением журнала в screen, вам не нужно выписывать каждую команду, которую вы ввели. Для активации функции ведения журнала screen просто нажмите Ctrl-a и H. Пожалуйста, будьте осторожны — используется заглавная H (то есть Shift+h). Использование прописной ‘h’ только создаст скриншот экрана screen в файле с именем hardcopy.

В нижней левой части экрана будет уведомление, которое говорит что-то вроде Creating logfile «screenlog.0» (производится ведение журнала экрана). В своей домашней директории вы найдёте файл screenlog.0.

Эта функция будет добавлять в файл всё, что вы делаете в окне screen. Для закрытия активности по ведению журнала screen, вновь нажмите Ctrl-a и H.

Другой способ активировать функцию ведения журнала: вы можете добавить параметр -L во время запуска screen. Команда будет выглядеть примерно так:

Блокировка screen

Screen также имеет комбинацию клавиш для блокировки окна screen. Вы можете нажать Ctrl-a и x для блокировки screen. Это полезно, если вы хотите быстро заблокировать ваш screen. Пример вывода после блокировки:

Вы можете использовать ваш пароль в Linux чтобы разблокировать его.

Добавление пароля на заблокированный screen

Для дополнительной безопасности, вы можете установить пароль на вашу сессию screen. Пароль будет спрашиваться каждый раз, когда вы хотите подсоединить screen. Этот пароль отличается от пароля в описанным выше механизме блокировки окна Screen.

Чтобы защитить паролем screen, вы можете отредактировать файл «$HOME/.screenrc». Если файл не существует, создайте его. Синтаксис будет примерно таким:

ВАШ_ПАРОЛЬ нужно указать в виде хеша, а не в виде обычного текста. Если там указано none, то пароль не будет спрашиваться. Если не указать пароль, то screen покажет приглашение для ввода пароля и его подтверждения и поместит хеш в буфер обмена.

Чтобы сгенерировать хеш, нужно выполнить следующую последовательность действий:

  • запустить сессию screen:
  • нажать Ctrl+a
  • там ввести:
  • появится приглашение ввести пароль и его подтвердить.
  • затем нажать Ctrl+a и ] — пароль будет скопирован на экран.

После того, как вы установите пароль password и нажмёте Ctrl-a и x, то у вас программа будет спрашивать пароль два раза: первым будет пароль пользователя, а затем пароль от screen . При подсоединении задач пароль будет спрашиваться только от screen.

Как выйти из Screen

Есть два способа покинуть screen. Первый это использовать Ctrl-a и d для отсоединения экрана. Второй — мы можем использовать команду exit для закрытия сессии screen. Вы также можете использовать Ctrl-a и K для остановки screen.

Как запустить скрипт, процесс которого отделён от терминала

С помощью screen также возможно запуск файла скрипта, который изначально будет отделён от терминала, например:

Это запустит отделённый (независящий) от терминала процесс. Можно отделить любую команду или процесс с помощью программы screen.

Как просмотреть предыдущие результаты (вывод)

Если вывод программы очень большой, то у вас могут возникнуть затруднения при скроллинге вверх.

Вы можете нажать Ctrl-a и Esc для входа в Copy mode (режим копирования). Когда вы окажитесь в режиме копирвоания, вы можете использовать для пролистывания экранов кнопки PageUp и PageDown.

Для выхода из Copy Mode, нажмите ещё раз Esc.

Как разделить экран на несколько вкладок в screen

В screen вы можете разделить окно на несколько виртуальных терминалов, которые будут одновременно присутствовать на экране. Для этого нажмите Ctrl-a и S.

Именные окна screen

Вы можете использовать несколько именных окон screen. Для этого запустите сессию screen с опцией -S, после которой укажите желаемое имя, например:

эта команда создаст screen с именем testing.

покажет текущие сессии screen с их именами:

Чтобы подключиться к именной сессии screen используйте опцию -x с именем сессии:

в результате предыдущей команды, вы подключитесь к testing screen.

Альтернатива для screen

Если вы ищите альтернативу для screen, то присмотритесь к tmux.

Это азы использования screen которые вам пригодятся практически при каждом её использовании. У программы ещё множество функций, с которыми вы можете ознакомится в её справке или на странице man.

Источник

Читайте также:  Темы для kali linux xfce
Оцените статью