Допустим, я запускаю несколько процессов из ssh-сессии. Можно ли завершить сеанс ssh, сохраняя эти процессы запущенными на удаленной машине?
Вам следует искать современные альтернативы, такие как tmux
.
tmux
превосходит screen
по многим причинам, вот лишь некоторые примеры:
Чтобы получить те же функции, которые описаны в ответе с рекомендациями экран
, вам необходимо сделать следующее:
tmux
, набрав tmux
в оболочке tmux
tmux
, набрав Ctrl + b , а затем d . Теперь безопасно выйдите из системы с удаленного компьютера, ваш процесс будет продолжать работать внутри tmux
. Когда вы вернетесь снова и захотите проверить статус своего процесса, вы можете использовать tmux attach
, чтобы присоединиться к сеансу tmux
.
Если вы хотите иметь несколько запущенных сеансов на стороне кроме того, вы должны назвать каждую сессию, используя Ctrl + b и $
. Вы можете получить список текущих запущенных сеансов, используя tmux list-sessions
, теперь присоединитесь к работающему сеансу командой tmux attach-session -t
.
] tmux
может делать гораздо более сложные вещи, чем обрабатывать одно окно за один сеанс. Дополнительную информацию можно найти в man tmux
или на странице tmux GitHub . В частности, здесь FAQ об основных различиях между screen
и tmux
.
Я застрял в большом mv, поэтому у меня не было возможности остановить процесс, настроить экран и запустить его снова. Мне удалось выйти из сеанса ssh с запущенным процессом, выполнив следующие действия:
Шаг 3 приостанавливает текущий процесс (например, моя команда 'mv').
Шаг 4 переводит приостановленный процесс в фоновый режим и возобновляет его.
Шаг 5 позволяет вам отказаться от процесса. ** Чтобы получить список заданий, просто введите jobs
раньше.
** Относительно отказа (из руководства bash):
disown [-ar] [-h] [jobspec ... | pid ... ]
Without options, remove each jobspec from the table of active
jobs. If jobspec is not present, and neither the -a nor the -r
option is supplied, 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 supplied, the -a option
means to remove or mark all jobs; the -r option without a job‐
spec argument restricts operation to running jobs. The return
value is 0 unless a jobspec does not specify a valid job.
Это можно сделать с помощью экрана
.
Введите man screen
, чтобы узнать больше или прочитайте эту screen man page.
Простой сценарий:
ssh в вашем удаленном ящике. Введите экран
и запустите нужный процесс.
Нажмите Ctrl-A, а затем Ctrl-D. Это "отсоединит" ваш сеанс экрана, но оставит ваши процессы запущенными. Теперь вы можете выйти из удаленного ящика.
Если вы хотите вернуться позже, войдите еще раз и введите screen -r
Это "возобновит" сеанс работы с вашим экраном, и вы сможете увидеть результат вашего процесса.
Эй, пока я согласен, что экран является наиболее эффективным вариантом. Вы можете использовать vncserver, а затем запустить на нем процесс.
Также, если вас интересует только запустить процесс и нет необходимости возвращать ему контроль, и, что наиболее важно, вы не знали, вам нужно будет закрыть сеанс, и у вас уже запущен процесс, вам не повезло, если вы использовали bash в качестве оболочки
Сначала вам нужно отправить процесс в фоновый режим, набрав Ctrl + Z, а затем bg% 1 (число зависит от задания число, обычно это 1, но вы можете легко вытащить список с помощью команды jobs)
Наконец, вызовите команду disown (за которой следует идентификатор задания ... так же, как с командой bg)
Это удалит родительский дочерние отношения между вашей оболочкой и процессом в фоновом режиме, предотвращая его смерть при завершении работы вашей оболочки.
Вы должны проверить Экран GNU и посмотреть, поможет ли он вам. В зависимости от того, как вам нужно приложение для работы в реальном времени, оно может вызвать больше проблем, чем решить, но, по крайней мере, это позволит вам возобновить сеанс, как если бы вы никогда его не покидали.
Как использовать:
экран
для первого запуска,прокрутите вводные сообщения, вы должны получить терминал. screen -r
, чтобы возобновить этот сеанс. У вас может быть несколько сеансов с отключенным экраном одновременно, в этом случае вам будет отображаться список доступных сеансов. Есть много других опций, например, разделение экранов, а также все ярлыки полностью настраиваемы.
Для одиночного сценария оболочки, который я выполнял в течение длительного периода времени, я войду в систему и запущу процесс в фоновом режиме с помощью '&'.
Пример:
/path/to/my/script &
Я вышел из системы и отключил сеанс SSH. Когда я вхожу в систему через некоторое время, сценарий все еще выполняется, что подтверждается непрерывным сбором данных из сценария.
Экран и нокап - это лучший способ, но если вам нужно отсоединить процесс, уже запущенный без экрана или нокапа, вы можете выполнить команду disown.
disown [-ar] [-h] [
jobspec
... |
pid
... ]
Без опций, удалите каждое jobspec из таблицы активных заданий. Если включена опция
-h
, задание не удаляется из таблицы, а помечается таким образом, что SIGHUP не посылается в задание, если оболочка получает SIGHUP. Если задание -h отсутствует, а опция-a
и опция-r
не поставляются, то используется текущее задание. Если не поставляется -a, опция-a
означает удаление или маркировку всех заданий; опция-r
без аргумента -a ограничивает работу запущенными заданиями.
С помощью функции -a
можно закрыть клемму и запустить процесс на машине.
nohup
Часто лучший способ - самый простой.
nohup long-running-command &
Он был создан специально для этого, он даже записывает стандартный вывод в nohup .log
.
man nohup
bg
+ disown
ctrl+z
bg
disown -h
Если вы хотите "фон" уже запущенных задач, тогда Ctrl + Z , затем запустите bg
, чтобы перевести последнюю приостановленную задачу в фоновый режим и позволить ей продолжить выполнение. disown
продолжит выполнение процесса после выхода из системы. Флаг -h
предотвращает зависание.
screen
и другие могут это сделать, но они не для этого. Я рекомендую nohup
для задач, которые, как вы знаете, собираетесь оставить, и bg
для задач, которые вы уже выполняете и не хотите запускать повторно.
Помните. , оба специфичны для bash. Если вы не используете bash, команды могут быть другими.
Самый простой ответ ...
ctrl + z приостановит запущенную программу
«bg» запустит ее в фоновом режиме
Есть две основные программы, которые вы можете использовать для поддержания программ и состояния терминала при нескольких соединениях ssh. Это screen (действующий, но, к сожалению, не обслуживаемый. Очевидно сейчас активно разрабатывается ) и tmux (более новый, активно поддерживается). Byobu - это интерфейс, который может работать поверх этих систем и предлагать дополнительную информацию о статусе Ubuntu. В новых установках он будет использовать tmux в качестве бэкэнда, если у вас есть более старая установка byobu и существующая конфигурация, он будет поддерживать предыдущий бэкэнд, будь то экран или tmux.
Byobu может быть установлен на компьютер делая это на машине на базе Debian:
sudo aptitude install byobu
Используя yum, вы делаете
su -c 'yum install byobu'
Также можно установить byobu в других дистрибутивах.
Вы можете запустить byobu, запустив byobu
на главном компьютере после подключения с помощью ssh.
Это даст вам оболочку, которая выглядит следующим образом:
Вы также можете использовать Терминал Byobu на машине Ubuntu с опцией -X и легко получить отлично работающий byobu.
Запустите byobu, набрав byobu
.
Вы можете нажать F2, чтобы создать новое окно в текущем сеансе, F3-F4, чтобы переключаться между различными окнами.
Самое лучшее в byobu то, что вам не нужно фактически убивать процессы, запущенные в терминале, чтобы покинуть терминал. Вы можете просто отправить screen / tmux (скелет byobu) в фоновый режим и возобновить работу в следующий раз, когда вы придете:
Чтобы оставить byobu и оставить его работающим (отсоединить), нажмите F6.
В следующий раз, когда вы придете, просто сделайте byobu
и вы должны вернуться туда, где вы были.
Вы также можете создавать различные сеансы byobu с помощью byobu -S session1
и так далее. И вы можете подключиться к любому из них, когда вернетесь.
Вы можете сделать гораздо больше с помощью Byobu. Используй это! Некоторые подробные руководства здесь или здесь .
Вы не можете сделать это после того, как процесс запущен, Вы должны настроить все, прежде чем запустить долгое время.
Вы можете использовать nohup, но современная мудрость советует Вам использовать экран или байобу в качестве логина, чтобы Вы могли отсоединить и оставить все запущенным.
Экран имеет то преимущество, что вы можете отсоединиться от одной машины и прикрепить к другой, что удобно, если вы хотите проверить на длительные процессы, которые работают после окончания рабочего дня.
Есть разумное начало работы руководство к экрану здесь.
байобу ставит простой в использовании интерфейс на верхней части экрана с меню и т.д.. Это также текущая реализация экрана на новых ubuntu. F2 для запуска нового терминала F3/F4 для переключения туда и обратно и F6 для отключения. Введите выход на фактические клеммы постоянно.
Самый простой способ - запустить команду в фоновом режиме с помощью и
. Затем просто напишите:
disown -a
Пока все говорят, что нужно использовать disown
(единственный вариант, который у вас есть после того, как вы уже запустили процесс), nohup
или даже выполнение команды на экране
, что полезно, если вы хотите увидеть все вывод команды ... Я поклонник screen
.. Я все еще пробовал самые последние распространенные дистрибутивы Linux, и просто перевод задания в фоновый режим и выход не вызывает всех процессов, которые бежит умирать. Должна быть глобальная настройка или что-то в этом роде. Я пробую это на некоторых довольно старых системах (Slackware 12), и мой тестовый скрипт продолжает работать, пока я не убью его вручную:
shell$ cat > test.pl
#!/usr/bin/perl
while(1){
sleep(1);
}
shell$ perl ./test.pl &
shell$ exit
logout
shell$ ps aux test.pl
mymom 31337 1 0 13:25 ? 00:00:00 perl ./test.pl
shell$
Хотя я согласен, что screen
будет лучшим способом запустить это, даже если мой сценарий записывает в файлы журналов или что-то еще ... Мне никогда не приходилось использовать disown -a
или nohup
, если только это не было полной паранойей. Может, кто-нибудь сможет пролить свет на то, как bash ведет себя по умолчанию? Может быть, некоторые системные администраторы изменяют значения по умолчанию для больших командных интерпретаторов, чтобы процессы своих пользователей не перегружали систему?
Вместо:
cmd options;
Добавьте перед nohup
:
nohup cmd options &
После этого вы сможете увидеть стандартный вывод консоли:
tail -f nohup.out
К сожалению, завершенная сессия SSH может привести к tmux или уничтожаемому экрану. Это вызвано тем, что systemd
завершит любые дочерние процессы после того, чтобы выходить из сессии.
Можно изменить эти настройки в Вашем logind.conf
(/etc/systemd/logind.conf
):
KillUserProcesses=no
Благодаря ответу в https://unix.stackexchange.com/questions/490267.