Сохраните процессы, бегущие за разъединениями сессии SSH

В то время как не точно, что Вы спросили, Вы могли использовать

#!/bin/bash -o pipefail

так, чтобы Ваши каналы возвратили последнее не нулевой возврат.

мог бы немного меньше кодировать

Править: Пример

[root@localhost ~]# false | true
[root@localhost ~]# echo $?
0
[root@localhost ~]# set -o pipefail
[root@localhost ~]# false | true
[root@localhost ~]# echo $?
1
210
23.01.2020, 22:07
11 ответов

Использовать nohup заставить Ваш процесс проигнорировать сигнал зависания:

$ nohup long-running-process &
$ exit
211
27.01.2020, 19:27
  • 1
    Это - это. Никакая потребность установить экран или tmux. Это - на самом деле старый добрый способ сделать это. Верный 'экран' или 'tmux' являются и wonderous приложениями и должны использоваться при необходимости, но столь же простой как выполнение процесса в фоновом режиме, которого можно выйти из системы, пойдите для вышеупомянутого. –  reiche 14.08.2010, 14:40
  • 2
    является nohup, любят, отрицают? –  cjac 15.08.2010, 12:12
  • 3
    псевдонима у Них есть подобные цели, но они отличаются во многих отношениях. nohup SIGHUP прерываний так, чтобы, когда оболочка, которая выполнила его, выходит и отправляет SIGHUP всем своим все еще рабочим детям, long-running-process не умирает. disown просто удаляет указанное задание из дочернего списка Bash, таким образом, это не попытается отправить SIGHUP вообще. nohup программа, отдельная от оболочки, таким образом, она работает со всеми оболочками, тогда как disown встроенный Bash. nohup принимает, что команда работает, тогда как disown только работы после задания запускаются, и у Вас есть фон оно так, можно возвратиться к оболочке. –  Warren Young 15.08.2010, 17:00
  • 4
    Потрясающий быстрый обзор для тех, кто незнаком с nohup и отрицает - а также некоторые простые способы иметь дело с терминальными сеансами serverwatch.com/tutorials/article.php/3935306 / … –  Dan 13.08.2014, 00:58
  • 5
    tail -f nohup.out проверять, что продолжается, когда Вы вернулись. –  Ricardo Stuven 03.11.2016, 17:15

Вы хотите использовать Экран GNU. Это является супер потрясающим!

ssh me@myserver.com
screen               #start a screen session
run-a-long-process

CTRL+a, d для отсоединений от экранной сессии

exit                 #disconnect from the server, while run-a-long-process continues

Когда Вы возвращаетесь к своему ноутбуку:

ssh me@myserver.com
screen -r            #resume the screen session

Затем проверьте прогресс своего продолжительного процесса!

screen очень всесторонний инструмент и может сделать намного больше, чем, что я описал. В то время как на экранной сессии, попробуйте ctrl+a? изучить несколько общих команд. Вероятно, наиболее распространенные:

  • CTRL+a, c для создания нового окна
  • CTRL+a, n для переключения на следующее окно на экранной сессии
  • CTRL+a, p для переключения на предыдущее окно на экранной сессии
  • если Вы входите в систему от набора различных систем, Вы, возможно, случайно оставили себя присоединенными к активной экранной сессии на другом компьютере. по этой причине я всегда возобновляюсь с screen -d -r гарантировать, что, если другая оболочка присоединена к моей экранной сессии, это будет отсоединено, прежде чем я возобновлю его на своей существующей системе.
141
27.01.2020, 19:27
  • 1
    tmux является современным аналогом экрана. –  zvolkov 14.08.2010, 05:21
  • 2
    , который я не знаю о современном, но ключевом префиксе по умолчанию tmux (Ctrl + b) помогает, если Вы привыкли к bash/emacs ключам. –  sajith 14.08.2010, 07:15
  • 3
    довольно прохладен, если Вы хотите общий терминал по некоторым причинам. Создайте экран screen -S name и позвольте своему другому другу соединиться с ним с screen -x name. –  Patrick 06.10.2010, 12:23
  • 4
    tmux с tmuxinator большая комбинация для необычных установок, в то время как я предпочитаю screen как быстрое и простое решение. –  earthmeLon 19.06.2014, 18:31
  • 5
    Этот ответ является лучшим.. Мне нравится он. Превосходное исследование –  Jaffer Wilson 07.01.2017, 14:30

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

Экран позволяет Вам выполнять несколько сессий виртуального терминала на той же ssh сессии. Учебное руководство и страницы справки доступны.

byobu является оберткой, которая позволяет легко открывать новые экраны с простой функциональной клавишей вместо сочетания клавиш от ctrl-a. Это также показывает строку состояния со всеми открытыми виртуальными терминалами, которые можно назвать.

Другой хорошей функцией является то, что весь Ваш экран может не лечь спать, в то время как Ваше соединение SSH разъединяется. Вы просто соединяетесь снова через ssh и называете byobu, и все похоже прежде.

Наконец некоторые снимки экрана byobu.

15
27.01.2020, 19:27
  • 1
    я запустил процесс на своем сервере в Терминале Byobu, действительно не зная то, чем это было (я просто искал Терминал и нажал на Byobu, потому что я никогда не видел его прежде). Я продолжал использовать Byobu, потому что он имел красочную строку состояния внизу, и я думал, что это было прохладно. Сегодня я желал для доступа к тому терминальному сеансу удаленно через SSH. Все, что я должен был сделать, было ввести "byobu", и он показал тот терминальный сеанс сразу же. Действительно счастливый я споткнулся через byobu! –  nick 10.03.2015, 22:13

Если Вы не запланировали заранее и устанавливаете screen, и т.д. просто сделайте следующее:

  1. Если Ваш процесс работает в фоновом режиме: goto № 3, еще: Ctrl-Z приостановить приоритетный процесс. Это сообщит о задании # приостановленного процесса, например:

    [1]+  Stopped                 processName
    
  2. Отправить processName к фону с bg %1 (использующий безотносительно задания # следует %). Это возобновится processName в фоновом режиме.

  3. Отрицать processName с disown %1 или disown PID. Используйте -h отметьте, если Вы хотите поддержать владение, пока Вы не завершаете свою текущую оболочку.

42
27.01.2020, 19:27
  • 1
    Спасибо за это! Я имел выполнение задания и думал, что не собирался быть способным сохранить его движением, потому что я не использовал & когда я запустил его. Это, кажется, работает отлично! –  Matt 25.03.2012, 18:42
  • 2
    Это удивительно! Я никогда не знал, что Linux мог позволить Вам передать управление активных процессов как это. Я боялся, что моя батарея перестанет работать, в то время как SSH'ing в мой сервер посреди длительного процесса, и это было ответом для меня! –  Pluto 21.05.2014, 00:05

Могло бы стоить отметить это

ssh -t lala screen -rxU moo присоединит к сессии мычания на хосте lala

ssh -t lala screen -S moo создаст сессию мычания на хосте lala

и

ssh -t lala screen -S moo quux создаст сессию мычания на хосте lala и запустит программу quux, выходя из сессии на завершении.

9
27.01.2020, 19:27

Я использую NX NoMachine, который свободен для меня, потому что это - только я. По существу это выполняет X сессий на сервере, с которым можно соединиться и разъединить из-за и. X сессий продолжают бежать, когда Вы не соединены. Связи могут быть установлены отовсюду. Можно выбрать между плавающими окнами или единственным окном, содержащим целый рабочий стол (например, полный рабочий стол Gnome). Клиент (который Вы работали бы на своем ноутбуке) может быть выполнен на Linux, MacOS, Солярисе или Microsoft Windows. В последнем случае, если Вы выбираете плавающие окна, они появляются индивидуально в Windows Taskbar.

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

2
27.01.2020, 19:27

Я решил свою собственную проблему.

Я открыл командную строку в окнах как администратор и ввел эту команду. bcdedit/set {bootmgr} path\EFI\ubuntu\grubx64.efi . Затем выключить не перезагрузить (я не знаю, если это имеет значение), то меня приветствовало очень знакомое меню grub:

Клянусь, что я уже пробовал это, но я попробовал это до того, как я сделал boot-repair, так что, может быть, это мог быть один из факторов, почему на этот раз он работал, а также, может быть, отключение вместо перезагрузки после bcdedit

-121--108172-

Частные пространства монтирования, созданные с помощью команды unshare файл private/etc/hosts для процесса оболочки и всех последующих дочерних процессов, запущенных из этой оболочки.

# Start by creating your custom /etc/hosts file
[user] cd ~
[user] cat >my_hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk
EOF

[user] sudo unshare --mount
# We're now running as root in a private mountspace. 
# Any filesystem mounts performed in this private mountspace
# are private to this shell process and its children

# Use a bind mount to install our custom hosts file over /etc/hosts
[root] mount my_hosts /etc/hosts --bind

[root] cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk

[root] exec su - appuser

[appuser] # Run your app here that needs a custom /etc/hosts file

[appuser] ping news.bbc.co.uk
PING news.bbc.co.uk (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.026 ms
^C
--- news.bbc.co.uk ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.026/0.044/0.062/0.018 ms
-121--1508-

Старый вопрос, странно все же никто не советовал tmux , который действует как обертка для n консолей и держать их открытыми до необходимости. Это позволяет больше управлять, помимо ряда функций tmux имеет. Управлять им несложно, вы просто выполняете tmux, который приводит вас в свою оболочку, запускаете задание поиска, затем нажимаете ctrl + b, за которым следует d (отсоединить) ( ctrl + b - «ok google» tmux, а d - команда закрыть без выхода из оболочки). Это на самом деле работает, если просто закрыть, например, замазку. После обеда при повторном подключении можно снова открыть tmux с помощью tmux attach , чтобы увидеть экран точно так, как вы ушли. Что-то, что я люблю, это разделение области: ctrl + b и затем нажмите ". Чтобы перейти из одной области в другую, ctrl + b , а затем нажмите стрелку вверх/вниз.

4
27.01.2020, 19:27

Вы можете найти хорошее руководство здесь: Keep Your SSH Session Running when You Disconnect

sudo apt-get install screen

Теперь вы можете начать новый сеанс экрана, просто набрав screen в командной строке. Вам будет показана некоторая информация об screen. Нажмите Enter, и вы окажетесь в обычном приглашении.

Чтобы отключиться (но оставить сеанс запущенным) Нажмите Ctrl + A, а затем Ctrl + D в мгновенной последовательности. Вы увидите сообщение [detached]

To reconnect to an already running session

screen -r

To reconnect to an existing session, or create a new one if none exists

screen -D -r

To create a new window within a running screen session. Нажмите Ctrl + A и затем C в мгновенной последовательности. Появится новое приглашение.

Для перехода от одного окна экрана к другому Нажмите Ctrl + A, а затем Ctrl + A последовательно.

Чтобы составить список открытых окон экрана Ctrl + A и затем W последовательно

8
20.08.2021, 13:40

Tmux — хороший вариант для запуска долго -запущенных процессов в фоновом режиме.

Мне приходится продолжать выполнять -длительно работающие процессы на экземпляре/сервере виртуальной машины облачной платформы Google (с ОС :Ubuntu 16.0 ). Там, где мне нужно запустить SSH-терминал и с терминала, я должен держать терминал подключенным, чтобы запустить процесс. Теперь до этого все хорошо. Но подождите, если соединение с моим SSH-терминалом прервется, то длительные -запущенные процессы немедленно остановятся, и, следовательно, мне придется повторно -запустить их еще раз после перезапуска ssh-терминала или с нового ssh-терминала.

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

Терминальный мультиплексор(tmux)для запуска сеанса tmux:

  1. Запустите терминал ssh
  2. Тип tmux. Откроется окно в том же терминале.
  3. Запустите команду, чтобы запустить долго -работающие процессы в сеансе tmux.

Теперь, даже если SSH-терминал внезапно закрывается/прекращается, сессия tmux продолжит выполнение запущенных lon -запущенных процессов на экземпляре/сервере.

Если соединение прервано, то как переподключить его, чтобы увидеть процессы, запущенные в сеансе tmux в фоновом режиме:

  1. переподключитесь или откройте новый терминал ssh. Чтобы увидеть этот процесс (, который продолжает работать в фоновом режиме ), введите команду :tmux attach.

Хотите завершить сеанс tmux:

  1. Остановить процесс. Затем введите exitв окне терминала tmux --.

(Обратите внимание, что :Если мы используем tmux detachкоманду :, она выйдет из окна/терминала сеанса tmux без прерывания/остановки сеансов tmux)

Подробнее см. следующую статью:

  1. https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/
  2. https://limitlessdatascience.wordpress.com/2019/08/22/tmux-to-keep-jupyter-notebook-running-in-the-background/
6
20.08.2021, 13:40

Если вы хотите запустить процесс в не -интерактивном сеансе ssh (, поэтому tmuxи screenотсутствуют ), вы можете:

ssh SERVER 'nohup bash -c "echo start; sleep 10; echo finish"'

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

ssh SERVER 'nohup bash -c "(echo start; sleep 10; echo finish)|tee -p /tmp/log"'

Это покажет вам вывод во время сеанса ssh, и если он отключится, tee -pпродолжит запись в файл /tmp/log.

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

1
20.08.2021, 13:40

В 2021 году мы также можем предложить для дистрибутивов Linux с systemd использоватьsystemd-runкак способ отсоединить процесс и сохранить его работу после закрытия входа в систему по ssh.

Можно запустить commandи позже проверить статус:

systemd-run --unit=background_cmd_service --remain-after-exit command
# later on
journalctl -b -u background_cmd_service
systemctl status background_cmd_service

При запуске службы от имени обычного пользователя может потребоваться включить задержку (ср. enable-lingerопция loginctl ). Это верно даже для nohup, поскольку systemd очищает все службы, запущенные в сеансе, после выхода пользователя из системы.

4
20.08.2021, 13:40

Теги

Похожие вопросы