Допустим, я запускаю кучу процессов из ssh-сессии. Можно ли завершить сеанс ssh, сохраняя эти процессы на удаленном компьютере?
Допустим, я запускаю кучу процессов из ssh-сессии. Можно ли завершить сеанс ssh, сохраняя эти процессы на удаленном компьютере?
Ответы:
Вы должны искать современные альтернативы, как tmux
.
tmux
превосходит по screen
многим причинам, вот лишь несколько примеров:
Для того, чтобы получить ту же функциональность , как описано в ответ рекомендации screen
, вы должны сделать следующее:
tmux
с ввода tmux
в оболочкуtmux
сеансаtmux
сеанс, набрав Ctrl+, bа затемd Теперь вы можете безопасно выйти из системы с удаленного компьютера, ваш процесс продолжит работать внутри tmux
. Когда вы вернетесь снова и захотите проверить состояние вашего процесса, вы можете использовать его tmux attach
для присоединения к вашему tmux
сеансу.
Если вы хотите, чтобы несколько сеансов выполнялись параллельно, вам следует называть каждый сеанс с помощью Ctrl+ bи $
. Вы можете получить список текущих запущенных сеансов, используя tmux list-sessions
, теперь присоедините к запущенному сеансу с помощью команды tmux attach-session -t 0
.
tmux
может делать гораздо более сложные вещи, чем обрабатывать одно окно за один сеанс. Для получения дополнительной информации посмотрите в man tmux
или на GitHub странице tmux . В частности, вот часто задаваемые вопросы об основных различиях между screen
и tmux
.
screen -x -r [screenname]
или screen -rx
для краткости, если у вас активен только один сеанс экрана. Это позволяет вам прикрепить существующий экземпляр экрана.
Ctrl-b
а затем d
, чтобы выйти / отключить tmux
сеанс. Конечно, это относится к версии tmux
на моем Ubuntu 12.04.
tmux detach
вместо того, чтобы печататьctrl-b d
nohup
Лучший способ часто самый простой.
nohup long-running-command &
Это было сделано специально для этого, он даже регистрирует стандартный вывод nohup.log
.
man nohup
bg
Если вы хотите «справиться» с некоторыми уже запущенными задачами, то лучше всего Ctrl+ Zзатем запустить
bg
перевести вашу последнюю приостановленную задачу в фоновый режим, чтобы она продолжала выполняться.
Затем быстрое disown
должно держать процесс запущенным после выхода из системы.
screen
и другие могут сделать это, но это не то, для чего они. Я рекомендую nohup
для задач, которые вы знаете, что вы собираетесь оставить позади, и bg
для задач, которые вы уже выполняете и не хотите перезапускать.
Имейте в виду, что оба bash специфичны. Если вы не используете bash, то команды могут отличаться.
disown -h
bg
+ disown
не работает для меня. У меня был запущен скрипт развертывания, я забыл запустить его внутри tmux, и мне нужно было рано уйти на встречу. Скрипт непрерывно выводит прогресс в оболочку. ctrl+z
остановил процесс, вернув меня в bash. bg
возобновил процесс, но он также возобновил вывод статуса в bash, делая невозможным просмотр того, что я печатал. Тем не менее, disown
команда выдала «disown: current: no
julia myFile.jl
по любой причине. Tmux делает и отлично.
Вы можете сделать это с помощью screen
.
Напечатайте, man screen
чтобы узнать больше или прочитайте эту страницу руководства экрана .
Простой сценарий:
SSH в ваш удаленный ящик. Тип screen
Затем запустите нужный процесс.
Нажмите Ctrl- Aтогда Ctrl- D. Это «отсоединит» ваш сеанс экрана, но оставит ваши процессы запущенными. Теперь вы можете выйти из удаленного окна.
Если вы хотите вернуться позже, войдите в систему еще раз и наберите « screen -r
Это» возобновит сеанс экрана, и вы сможете увидеть результаты вашего процесса.
screen -S name
чтобы потом было проще подключиться к нужному.
screen -S
перед отъездом и screen -r
при возвращении удивительно!
Screen и nohup - лучший способ, но если вам нужно отсоединить процесс, уже запущенный без screen или nohup, вы можете запустить команду disown.
disown [-ar] [-h] [
jobspec
… |
pid
… ]
Без параметров удалите каждую спецификацию заданий из таблицы активных заданий. Если
-h
указан этот параметр, задание не удаляется из таблицы, а помечается так, что SIGHUP не отправляется заданию, если оболочка получает SIGHUP. Если задание отсутствует, и-a
ни-r
опция, ни опция не указаны, используется текущее задание. Если спецификация-a
заданий не указана, опция означает удалить или отметить все задания;-r
вариант без jobspec аргумента ограничивает операцию выполнения заданий.
С помощью disown вы можете закрыть терминал и запустить процесс на компьютере.
disown -a && exit
disown
и это убило его.
Я застрял в большом 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.
disown
встроенная команда действует для самого последнего фонового задания.
Есть две основные программы, которые вы можете использовать для поддержки программ и состояния терминала через несколько соединений SSH. Это screen (действующий, но, к сожалению, не поддерживаемый. Видимо , сейчас активно развивается ) и tmux (более новый, активно поддерживаемый). Byobu - это интерфейс, который может работать поверх этих систем и предоставлять дополнительную информацию о состоянии Ubuntu. В новых установках он будет использовать tmux в качестве бэкэнда, если у вас более старая установка byobu и существующий конфиг, он будет поддерживать предыдущий бэкэнд, будь то screen или tmux.
Byobu можно установить на компьютер, выполнив это на компьютере с Debian:
sudo aptitude install byobu
Используя yum, вы делаете
su -c 'yum install byobu'
Также возможно установить byobu на другие дистрибутивы.
Вы можете запустить byobu, запустив byobu
на хост-машине после подключения с помощью ssh. Это даст вам оболочку, которая выглядит следующим образом:
Вы также можете использовать Byobu Terminal на машине с Ubuntu с опцией -X и легко получить идеально работающую byobu.
Начните byobu, набрав byobu
.
Вы можете нажать F2, чтобы создать новое окно в текущем сеансе, F3-F4, чтобы переключаться между различными окнами.
Самое приятное в byobu - вам не нужно фактически убивать процессы, запущенные в терминале, чтобы покинуть терминал. Вы можете просто отправить screen / tmux (скелет byobu) на задний план и продолжить в следующий раз:
В следующий раз, когда вы приедете, просто сделайте, byobu
и вы должны вернуться туда, где вы были.
Вы также можете создавать различные сеансы byobu byobu -S session1
и так далее. И вы можете подключиться к любому из них, когда вы вернетесь.
Вы можете сделать гораздо больше, используя Byobu. Используй это! Некоторые окончательные руководства здесь или здесь .
Вы не можете сделать это после запуска процесса, вам нужно настроить все, прежде чем запускать долго выполняемое задание.
Вы можете использовать nohup, но современная мудрость предполагает, что вы используете экран или byobu в качестве логина, чтобы вы могли отсоединиться и оставить все как есть.
Преимущество Screen заключается в том, что вы можете отсоединиться от одного компьютера и снова подключить его к другому, что удобно, если вы хотите проверить длительно работающие процессы, работающие после конца рабочего дня.
Существует разумное руководство по началу работы здесь.
Byobu помещает простой интерфейс в верхнюю часть экрана с меню и т. д. Это также текущая реализация экрана в более новой версии Ubuntu. F2 для запуска новой клеммы F3 / F4 для переключения вперед и назад и F6 для отключения. Введите exit, чтобы окончательно завершить терминалы.
disown
для этого. Смотрите ответ @ bassgey
disown
а при необходимости просто Ctrl-z
, bg
чтобы получить его из активного терминала и в фоновом режиме. Тогда disown
.
Эй, пока я согласился, что экран - самый эффективный вариант. Вы можете использовать vncserver, а затем запустить процесс на нем.
Кроме того, если ваш единственный интерес заключается в том, чтобы запустить процесс и не нужно возвращать его к себе, и, что крайне важно, вы не знали, что вам нужно будет закрыть сеанс, и у вас уже запущен процесс, вам не повезет, если Вы использовали Bash в качестве оболочки
Сначала вам нужно отправить процесс в фоновый режим, набрав Ctrl + Z, а затем bg% 1 (число зависит от номера задания, обычно это 1, но вы можете легко получить список, используя команду jobs)
Наконец, вызовите команду disown (с последующим идентификатором jobid ... как с командой bg)
Это удалит отношения родитель-потомок между вашей оболочкой и процессом в фоновом режиме, предотвращая его отмирание при завершении работы оболочки.
screen
, что после входа в систему был задан вопрос, как сохранить процессы запущенными, теперь после входа в систему, но до их запуска. Отличный ответ Хорхе, вы действительно помогли мне! :)
bg
(без %1
) достаточно часто, так как по умолчанию текущая работа
Для одного сценария оболочки, который я выполняю в течение длительного периода времени, я войду в систему и запусту процесс в фоновом режиме, используя '&'.
Пример:
/path/to/my/script &
Я вышел из системы и отключил сеанс SSH. Когда я регистрируюсь через некоторое время, сценарий все еще выполняется, что подтверждается непрерывным сбором данных из сценария.
&
если вы выйдете из системы и войдете в сеанс SSH, процесс все равно будет работать, однако вы не сможете увидеть выходные данные этого процесса (если ваш сценарий повторяет что-то, что вы не увидит, но если он напишет файл, файл будет там)
Вы должны проверить GNU Screen и посмотреть, поможет ли он вам. В зависимости от того, как вам нужно, чтобы ваше приложение работало в реальном времени, оно может вызвать больше проблем, чем решает, но, по крайней мере, позволит вам возобновить сеанс, как будто вы его никогда не покидали.
Как пользоваться :
screen
для первого запуска, пролистайте вводные сообщения, вам должен быть вручен терминал.screen -r
чтобы возобновить этот сеанс. Вы можете иметь несколько отдельных сеансов экрана одновременно, в этом случае вам будет показан список доступных сеансов.Есть много других опций, например, разделенные экраны, а также все ярлыки полностью настраиваемые.
Самый простой ответ ...
Ctrl + Z приостановит запущенную программу
«BG» будет запускать его в фоновом режиме
disown
или nohup
) это обычно не будет запускать процесс после окончания сеанса SSH.
Хотя все говорят, что нужно использовать disown
(единственный вариант, который у вас есть после того, как вы уже запустили процесс), nohup
или даже запустить команду screen
, что полезно, если вы хотите увидеть весь вывод команды ... Я фанат 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 по умолчанию? Может быть, некоторые системные администраторы изменяют настройки по умолчанию для больших оболочек, чтобы процессы своих пользователей не перегружали систему?
К сожалению, завершенный сеанс SSH может привести к удалению tmux или экрана. Это потому, systemd
что прекратит любые дочерние процессы при выходе из сеанса.
Вы можете изменить эту настройку в вашем logind.conf
( /etc/systemd/logind.conf
):
KillUserProcesses=no
Спасибо за ответ в https://unix.stackexchange.com/questions/490267 .
Вместо :
cmd options;
Добавить до nohup
:
nohup cmd options &
Затем вы сможете увидеть стандартный вывод консоли:
tail -f nohup.out