Логотип

Как поддерживать работу удалённых SSH-процессов даже при отключении

Как поддерживать работу удалённых SSH-процессов даже при отключении

SSH или Secure Shell — это, простыми словами, способ, с помощью которого пользователь может получить удалённый доступ к другому пользователю в другой системе, но только в режиме командной строки, то есть без графического интерфейса. Если говорить более техническим языком, то когда мы подключаемся по SSH к другому пользователю в другой системе и запускаем команды на этом компьютере, он фактически создаёт псевдотерминал и подключает его к оболочке входа в систему пользователя, вошедшего в систему.

Когда мы выходим из сеанса или сеанс завершается после длительного простоя, на псевдотерминал отправляется сигнал SIGHUP, и все задания, запущенные на этом терминале, даже те, родительские задания которых были запущены на псевдотерминале, также получают сигнал SIGHUP и принудительно завершаются.

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

 

Понимание процессов в Linux

Обычный процесс

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

Бесхозный процесс

Бесхозные процессы — это процессы, у которых изначально был родительский процесс, создавший их, но через некоторое время родительский процесс непреднамеренно завершился или вышел из строя, в результате чего init стал родительским процессом для этого процесса. Непосредственным родительским процессом для таких процессов является init, который ожидает завершения этих процессов.

Процесс-демон

Это некоторые намеренно оставленные без присмотра процессы. Такие процессы, которые намеренно не завершаются в системе, называются демонами или намеренно оставленными без присмотра процессами. Обычно это длительные процессы, которые запускаются, а затем отключаются от любого управляющего терминала, чтобы они могли работать в фоновом режиме до тех пор, пока не завершатся или не выдадут ошибку. Родительский процесс таких процессов намеренно завершается, чтобы дочерний процесс работал в фоновом режиме.

 

Способы сохранения SSH-сессии после отключения

Существует несколько способов сохранить SSH-сессию после отключения, как описано ниже:

1. Использование команды screen для сохранения SSH-сессии

screen — это текстовый оконный менеджер для Linux, который позволяет пользователю одновременно управлять несколькими терминальными сессиями, переключаться между ними, вести журнал сессий на экране и даже возобновлять сессию в любое время, не беспокоясь о том, что пользователь выйдет из сессии или закроет терминал.

Читать  Как использовать команду Dig для запроса DNS в Linux

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

Запуск сеанса экрана

После ввода команды ‘screen’ вы окажетесь в новом сеансе экрана. В этом сеансе вы можете создавать новые окна, переключаться между ними, блокировать экран и делать многое другое, что можно делать в обычном терминале.

$ screen

 

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

Выполнение команд в сеансе просмотра экрана

 

Отключение экрана

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

Чтобы отсоединить экран от удалённого терминала, просто нажмите “Ctrl+a” сразу после “d” и вы вернётесь в терминал, где увидите сообщение о том, что экран отсоединён. Теперь вы можете безопасно выйти из системы, и ваша сессия сохранится.

Отключение сеанса работы с экраном Linux

 

Возобновление сеанса с отсоединённым экраном

Если вы хотите возобновить сеанс с отсоединённым экраном, который вы завершили перед выходом из системы, просто снова войдите в систему удалённого терминала и введите “screen -r” в случае, если открыт только один экран, а если открыто несколько сеансов с экранами, введите “screen -r <pid.tty.host>”.

$ screen -r
$ screen -r <pid.tty.host>

 

Возобновить сеанс с Отключенным Экраном

 

2. Использование Tmux (терминального мультиплексора) для поддержания работы SSH-сессий

Tmux — это ещё одно программное обеспечение, созданное для замены screen. Оно обладает большинством возможностей screen, а также некоторыми дополнительными возможностями, которые делают его более мощным, чем screen.

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

Читать  Как выполнить запрос POST с помощью Curl
Запустите сеанс Tmux

После подключения по ssh к удаленному хосту и ввода команды tmux вы войдете в новый сеанс с открытым перед вами окном, в котором вы можете делать все то же, что и в обычном терминале.

$ tmux

 

Запуск терминального сеанса tmux

 

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

Выполнение команд Linux в сеансе Tmux

 

Отсоединить сеанс Tmux от терминала

Вы можете запустить “tmux detach” в работающем сеансе tmux или воспользоваться сочетанием клавиш (Ctrl+b then d). После этого ваш текущий сеанс будет отсоединён, и вы вернётесь в терминал, откуда сможете безопасно выйти из системы.

$ tmux detach

 

 

Выход из сеанса Tmux в Linux

 

Возобновление закрытого сеанса Tmux

Чтобы повторно открыть сеанс, который вы закрыли и оставили без изменений при выходе из системы, просто войдите в систему на удалённом компьютере и введите «tmux attach», чтобы повторно подключиться к закрытому сеансу. Он останется активным.

$ tmux attach

 

Закрытая сессия Resume Tmux

 

3. Использование команды nohup для продолжения работы в сеансах SSH

Если вы не очень хорошо знакомы с screen или tmux, вы можете использовать nohup и отправить долго выполняющуюся команду в фоновый режим, чтобы продолжить работу, пока команда выполняется в фоновом режиме. После этого вы можете спокойно выйти из системы.

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

Выполнение команды с помощью nohup в фоновом режиме

Вот простой сценарий, в котором мы запускаем команду find для поиска файлов в фоновом режиме в сеансе ssh с помощью nohup, после чего задача отправляется в фоновый режим, а запрос немедленно возвращается с указанием PID и задания ID процесса ([JOBID] PID).

# nohup find / -type f $gt; files_in_system.out 2>1 &

Запустите команду Linux в фоновом режиме

 

Возобновление сеанса для проверки того, выполняется ли задание

При повторном входе в систему вы можете проверить статус команды, вернуть ее на передний план с помощью 'fg %JOBID' для отслеживания прогресса и т. д. Ниже приведен вывод, который показывает, что задание было выполнено, так как оно не отображается при повторном входе в систему, и выводится результат.

# fg %JOBID

Запустите команду Linux в фоновом режиме

 

Читать  Больше никаких секретов: воссоздайте знаменитый эффект расшифровки данных, который можно увидеть в фильме «Кроссовки»

4. Использование команды disown для поддержания работы SSH-сессий

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

Disown удаляет задание из списка заданий системы, поэтому процесс не будет завершён при выходе из сеанса, так как не получит SIGHUP от оболочки при выходе из системы.

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

Выполнение команды с использованием disown в фоновом режиме

Ниже мы отправили команду ping в фоновый режим, чтобы она продолжала работать и была удалена из списка заданий. Как видно, задание сначала было приостановлено, а затем снова появилось в списке заданий под идентификатором процесса: 15368.

$ ping andreyex.ru > pingout &
$ jobs -l
$ disown -h %1
$ ps -ef | grep ping

 

После этого сигнал disown был передан заданию, и оно было удалено из списка заданий, хотя и продолжало выполняться в фоновом режиме. Задание продолжало выполняться, когда вы повторно вошли на удалённый сервер, как показано ниже.

$ ps -ef | grep ping

5. Использование команды setsid для запуска SSH-сессий

Ещё одна утилита, позволяющая добиться нужного поведения, — setsidNohup имеет недостаток, заключающийся в том, что группа процессов остаётся прежней, поэтому процесс, запущенный с помощью nohup, уязвим для любого сигнала, отправленного всей группе процессов (например, Ctrl + C).

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

Выполните любую команду с помощью setsid

Здесь показано, что процесс ‘sleep 10m’ был отсоединён от управляющего терминала с момента своего создания.

$ setsid sleep 10m
$ ps -ef | grep sleep

 

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

$ ps -ef | grep [s]leep

Заключение

Какие способы вы могли бы предложить для продолжения работы вашего процесса даже после выхода из сеанса SSH? Если вы знаете какой-то другой эффективный способ, поделитесь им в комментариях.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Редактор: AndreyEx

Рейтинг: 5 (1 голос)
Если статья понравилась, то поделитесь ей в социальных сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


Загрузка...

Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала