В настоящее время я использую SSH-клиент для подключения к серверу, который использует моя лаборатория. У меня возник вопрос относительно концепции «сессии, работающей в фоновом режиме». Я посмотрел вопрос в этом сообществе (что такое фоновый процесс?), но мне кажется, что это немного отличается от того, что я себе представляю.
На сервере, с которым мы работаем (я не уверен, проблема в сервере или в подключении к Интернету), возникли некоторые проблемы. Например, когда мы оставляем процесс запущенным на ночь и возвращаемся утром, сеансы оболочки отключаются.
Одним из решений, которое кто-то предложил, является использование программыТмукчтобы обойти эту проблему. Программа, как утверждается, отключает сеанс, так что даже если сервер отключится, наш процесс не будет нарушен.
Мне просто интересно, что именно означает процесс "работает в фоновом режиме"? Это то же самое, что и вопрос, на который я дал ссылку выше, или я просто не понимаю его правильно? Кроме того, что означает "прикрепить или отсоединить" сеанс?
Полагаю, мое замешательство вызвано тем, что я не понимаю, как сеанс может работать, когда оболочка отключается.
Спасибо!
решение1
У вас возникли трудности с этой концепцией, потому что такой концепции не существует. Группы процессовможет быть на заднем плане/переднем плане. Концепция не применяется ксеансы, ни то, что операционная система называет сеансами, ни то, что tmux
называет сеансами, а это две совершенно разные вещи.
Что tmux
делает, так это создает один или несколько псевдотерминалов, которые программы, работающие внутри, tmux
видят в качестве своих управляющих терминалов (и стандартных входов, выходов и ошибок для начала).мультиплексыэти внутренние терминалы на одинвнешнийтерминал, который будет псевдотерминалом, настроенным SSH-сервером на вашем компьютере при входе в систему через SSH.
Есть два tmux
процесса, долгоживущийсерверкоторый подключается к задним концам (т.е. к «главным» сторонам, если использовать устаревшую терминологию) всех этих внутренних псевдотерминалов, иклиентэто посредник между этим сервером и реализованным внешним терминалом. На самом деле, клиентов может быть несколько, но это сложность, которую мы можем здесь обойти, так как это не меняет сути.
TheсерверПроцесс существует до тех пор, пока остается хотя бы один внутренний псевдотерминал. Он группирует псевдотерминалы в коллекции, которые и есть то, что tmux
вызываетсеансы. Это не следует путать с тем, что ваша операционная система называет сеансом (совокупностью групп процессов и, опционально, управляющим терминалом) илисессияпо SSH (между удаленным SSH-сервером и вашим локальным SSH-клиентом). "сеанс" может обозначать множество разных вещей. Обратите внимание, что я по-разному квалифицирую его tmux
здесь с помощью " ", "SSH" и "операционная система".
Theклиентпроцесс преходящий и проходит —отсоединениеиз tmux
сеанса и сервера — с потерей SSH-соединения. Когда вы заново входите в систему с SSH, вы создаетеновыйклиент, которыйповторно прикрепляетк ( tmux
сеансу, управляемому) сервером, и этот новый клиент реализует пользовательский интерфейс сервера tmux
— всеокнав tmux
сеансе и строке состояния — на свежий псевдотерминал для вашего нового сеанса входа SSH. Клиент реализует один tmux
сеанс за раз, тот, к которому он в данный момент подключен.
Клиентский процесс является частью того, что операционная система называет сеансом, сеансом, который контролируетсявнешнийпсевдотерминал, созданный вашим сервером SSH для входа по SSH. Он зависит от продолжительности сеанса операционной системы, который, в свою очередь, зависит от продолжительности сеанса SSH, и может находиться в фоновой или приоритетной группе процессовэтого внешнего терминала. Он (тем самым) подлежитконтроль заданий оболочкиоболочки входа в этот сеанс SSH.
Процесс сервера полностью отделен от внешнего терминала и его сеанса(ов) операционной системы. Он не подчиняется их времени жизни. Онне вих фоновые или фоновые группы процессов. Его продолжительность жизни определяется исключительно продолжающимся существованиемвнутреннийтерминалы, чьи операции ввода-вывода он обслуживает tmux
клиентам.
Естьвнутреннийивнешнийтерминалы. Естьприкрепилиотсоединенный tmux
сеансы, по расширению от клиентов, присоединяющихся к tmux
серверам и отсоединяющихся от них. Естьактивныйинеактивныйокна в tmux
сеансе. Концепция управления заданиями оболочкифонипередний планне участвует.
решение2
Процессы Unix можно назвать «работающими в фоновом режиме» двумя основными способами:
Все еще родительский процесс, например, shell. Вот что происходит, если вы используете оператор
&
в оболочках Bourne:sleep 10 &
Этот
sleep
процесс будет запущен оболочкой в фоновом режиме, поэтому он продолжит работу, но вы можете взаимодействовать с приглашением оболочки и выполнять другие команды. Если программа, работающая в фоновом режиме, как эта, попытается прочитать какой-либо ввод, она будет остановлена сигналомSIGTTIN
.Однако, что важно, он по-прежнему принадлежит процессу оболочки, в котором он был запущен, и по-прежнему подключен к tty (терминалу, на котором он запущен), и если tty закрыт (соединение ssh разорвано и оболочка завершается), процесс будет завершен с помощью
SIGHUP
.Это называется управлением заданиями оболочки — процессы можно переводить в фоновый режим с помощью
&
илиbg
или^Z
и возвращать на передний план с помощьюfg
и перечислять с помощьюjobs
и т. д. На самом деле это предназначено для временного перевода одной команды в фоновый режим, пока вы работаете над другой, а не для долго выполняющихся процессов, которые должны быть защищены от выхода из оболочки и отключения терминала.Процесс-демон. Это процесс, который полностью отделяет себя от родительского процесса и от его tty. У него новая группа процессов и идентификатор сеанса, а его родительский PID — 1 (обычно
init
, хотя в современном Linux, как я полагаю,systemd
он взял на себя эту роль). Поскольку процесс-демон не является родительским процессом оболочки и не прикреплен к tty, он не завершается при выходе из оболочки или закрытии tty. Он должен быть явно завершен системой или пользователем. Большинство систем Unix поставляются со множеством демонов по умолчанию для выполнения самых разных задач.
Это общее объяснение, и в нем есть множество подробностей об управлении заданиями оболочки и процессах-демонах, которые я не упомянул.
Есть программа nohup
, которая может заставить программу работать с (1) игнорированием сигнала SIGHUP
, чтобы она не выходила при закрытии tty. Это не делает ее настоящим демоном, но она хороша для простых задач, которые только выводят и никогда не требуют ввода.
tmux — это программа, которая работает как демон, но позволяет вам запускать другие программы (оболочки или что-то еще) внутри себя. tmux гораздо сложнее, чем nohup
— вы можете запускать полноэкранные программы и программы, которым требуется как ввод, так и вывод. Поскольку это демон, он не завершается при исчезновении tty (например, при разрыве соединения ssh).
В tmux «присоединенный» означает, что tmux показывает один или несколько процессов, запущенных внутри него на терминале. Вы можете «отсоединить» tmux от этого терминала, а затем «присоединить» его снова к другому терминалу. Отсоединение происходит автоматически, если соединение ssh разрывается или уничтожается. Таким образом, вы можете закрыть свой терминал и ssh, а затем позже подключиться с другого терминала и присоединить tmux, и все будет так, как было.