Как отключить сессию ssh, не убивая запущенный процесс?

2744
xcorat

Я запустил тестовое изменение размера файловой системы на сервере через ssh, но совершенно забыл сделать это в screenсеансе. Сейчас он работает, и у моего ноутбука очень медленный интернет. Есть ли способ сохранить его работоспособным, если я потеряю соединение ssh?

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

ОС: эквивалент RHEL7.2 (SL7).

Вероятно, лучше связать это как решение: https://stackoverflow.com/questions/625409/how-do-i-put-an-already-running-process-under-nohup

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

4
Возможный дубликат [Как сохранить работу после выхода из системы?] (Https://superuser.com/questions/190827/how-do-i-keep-jobs-running-after-logout) JakeGould 6 лет назад 1

3 ответа на вопрос

4
Kamil Maciorowski

Это как раз тот случай, когда man 1 reptyrявно упоминается:

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

Не пропустите эту заметку:

reptyrзависит от ptrace(2)системного вызова для подключения к удаленной программе. В Ubuntu Maverick и выше эта возможность отключена по умолчанию из соображений безопасности. Вы можете включить его временно, выполнив

echo 0 > /proc/sys/kernel/yama/ptrace_scope 

от имени root или навсегда, отредактировав файл /etc/sysctl.d/10-ptrace.conf, который также содержит дополнительную информацию об этом параметре.

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

Основное использование простое:

reptyr PID 

где PIDPID процесса, который вы хотите подключить к новому терминалу.

4
apocalysque

использование

Ctrl-Z 

приостановить приложение и вернуться в командную строку. Тогда используйте

bg 

чтобы процесс продолжался в фоновом режиме. Наконец использовать

disown 

Так что процесс не будет закрыт, когда вы отключите сеанс и закроете свой терминал.

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

2
thrig

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

$ ssh somecentos7system -bash-4.2$ sleep 252727 ^Z [1]+ Stopped sleep 252727 -bash-4.2$ bg [1]+ sleep 252727 & -bash-4.2$ disown -bash-4.2$ logout Connection to somecentos7system closed. $ ssh somecentos7system -bash-4.2$ pgrep -lf 252727 20089 sleep -bash-4.2$  

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

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