Я подключаюсь к машине Linux через SSH и пытаюсь запустить тяжелый сценарий bash, который выполняет операции с файловой системой. Ожидается, что он будет работать в течение нескольких часов, но я не могу оставить сеанс SSH открытым из-за проблем с подключением к Интернету.
Сомневаюсь, что запуск скрипта с фоновым оператором амперсанд (&
), подойдет, потому что я попробовал и позже обнаружил, что процесс не был завершен. Как я могу выйти и продолжить процесс?
Лучший способ - запустить процесс в терминальном мультиплексоре. В качестве альтернативы вы можете сделать так, чтобы процесс не получал сигнал HUP.
А оконечный мультиплексор предоставляет «виртуальные» терминалы, которые работают независимо от «реального» терминала (фактически все терминалы сегодня являются «виртуальными», но это уже другая тема для другого дня). Виртуальный терминал будет продолжать работать, даже если ваш реальный терминал закрыт с сеансом ssh.
Все процессы, запущенные с виртуального терминала, будут продолжать работать с этим виртуальным терминалом. При повторном подключении к серверу вы можете повторно подключиться к виртуальному терминалу, и все будет так, как будто ничего не произошло, кроме прошедшего времени.
Два популярных оконечных мультиплексора: экран и tmux.
Экран требует обучения. Вот хороший учебник с диаграммами, объясняющими концепцию: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/
В HUP сигнал (или SIGHUP) отправляется терминалом всем его дочерним процессам, когда терминал закрыт. Обычное действие при получении SIGHUP - завершить работу. Таким образом, когда ваш сеанс ssh будет отключен, все ваши процессы завершатся. Чтобы избежать этого, вы можете сделать так, чтобы ваши процессы не получали SIGHUP.
Два простых способа сделать это: nohup
и disown
.
Для получения дополнительной информации о том, как nohup
и disown
Работы прочтите этот вопрос и ответьте: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
Примечание: хотя процессы будут продолжать работать, вы больше не сможете взаимодействовать с ними, потому что они больше не привязаны к какому-либо терминалу. Этот метод в основном полезен для длительных пакетных процессов, которые после запуска больше не требуют ввода данных пользователем.
Есть несколько способов сделать это, но я считаю наиболее полезным использовать Экран GNU.
После ssh запустите screen
. Это запустит другую оболочку, работающую на экране. Запустите свою команду, затем выполните Ctrl-а d.
Это «отключит» вас от сеанса экрана. На этом этапе вы можете выйти из системы или сделать что угодно еще.
Если вы хотите повторно подключиться к сеансу экрана, просто запустите screen -RD
из приглашения оболочки (как тот же пользователь, который создал сеанс).
В bash
, то disown
ключевое слово идеально подходит для этого. Сначала запустите свой процесс в фоновом режиме (либо используйте &
, или ^Z
затем введите bg
):
$ wget --quiet http://server/some_big_file.zip &
[1] 1156
Набрав jobs
вы можете видеть, что процесс по-прежнему принадлежит оболочке:
$ jobs
[1]+ Running wget
Если на этом этапе вы выйдете из системы, фоновая задача также будет остановлена. Однако если вы запустите disown
, bash отключает задание и позволяет ему продолжить выполнение:
$ disown
Вы можете это подтвердить:
$ jobs
$ logout
Вы даже можете комбинировать &
и disown
в той же строке, например:
$ wget --quiet http://server/some_big_file.zip & disown
$ logout
Это лучше, чем бегать nohup
на мой взгляд, потому что он не уходит nohup.out
файлы разбросаны по всей вашей файловой системе. Также, nohup
должен быть запущен перед запуском команды - disown
можно использовать только в том случае, если позже вы решите, что хотите выделить задачу в фоновом режиме и отсоединить ее.
Инструмент nohup, доступный на большинстве компьютеров с Linux, сделает это.
Чтобы быть внимательным, я укажу tmux, который имеет ту же основную идею, что и экран:
tmux задуман как современная альтернатива под лицензией BSD таким программам, как экран GNU. Основные функции включают:
- Мощный, последовательный, хорошо документированный и легко настраиваемый командный интерфейс.
- Окно можно разделить на панели по горизонтали и вертикали.
- Панели можно свободно перемещать и изменять их размер, а также размещать в предварительно заданных макетах.
- Поддержка UTF-8 и 256-цветных терминалов.
- Скопируйте и вставьте с несколькими буферами.
- Интерактивные меню для выбора окон, сеансов или клиентов.
- Измените текущее окно, выполнив поиск текста в целевом объекте.
- Блокировка терминала вручную или по истечении времени ожидания.
- Чистая, легко расширяемая кодовая база с лицензией BSD, которая находится в стадии активной разработки.
Однако искать в Google примерно бесконечно проще.
Экран слишком силен для того, чтобы просто поддерживать работу процессов при выходе из системы.
Пытаться dtach:
dtach - это программа, написанная на C, которая имитирует функцию отсоединения экрана, что позволяет программе выполняться в среде, защищенной от управляющего терминала. Например, на программу под управлением dtach не повлияет отключение терминала по какой-либо причине.
dtach был написан, потому что screen не соответствовал моим потребностям; Мне не понадобились дополнительные функции экрана, такие как поддержка нескольких терминалов или поддержка эмуляции терминала. экран также был слишком большим, громоздким и имел трудный для понимания исходный код.
screen также мешал мне использовать полноэкранные приложения, такие как emacs и ircII, из-за чрезмерной интерпретации потока между программой и подключенными терминалами. dtach не имеет уровня эмуляции терминала и передает необработанный выходной поток программы подключенным терминалам. Единственная обработка ввода, которую выполняет dtach, - это сканирование символа отсоединения (который сигнализирует dtach об отсоединении от программы) и обработка клавиши приостановки (которая сообщает dtach временно приостановить себя, не влияя на запущенную программу), и оба из них могут одновременно быть отключенным при желании.
В отличие от экрана, dtach имеет минимальные функции и чрезвычайно мал. Это позволяет легче проверять dtach на наличие ошибок и дыр в безопасности и делает его доступным в средах с ограниченным пространством, например, на аварийных дисках.
Вот способ демонизировать любой процесс оболочки, никаких внешних программ не требуется:
( while sleep 5; do date; done ) <&- >output.txt &
Когда вы затем закроете сеанс, задание будет продолжать выполняться, о чем свидетельствует файл output.txt (который имеет буферизацию, поэтому требуется время, чтобы показать ненулевое значение). Не забывайте убивать свою работу после тестирования.
Итак, все, что вам нужно сделать, это закрыть стандартный ввод и выполнить задание в фоновом режиме. Чтобы быть действительно хорошим, сначала cd /
так что вы не держитесь за гору.
Это работает даже в простом sh под Solaris.
В at
Команда может быть полезна в такой ситуации. Например, введите:
at now
Затем вы можете ввести команду или серию команд, которые будут выполняться. Результаты должны быть отправлены вам по электронной почте, если электронная почта настроена правильно на машине.
Вместо того now
, вы можете указать время необязательно с датой или выражением времени, например now + 15 minutes
. Видеть man at
Больше подробностей.
byobu
в Ubuntu есть хороший интерфейс для экрана. Нажимая Ctrl-? вы получите список всех сочетаний клавиш. Он добавляет строку состояния, которая может быть полезна для наблюдения за загрузкой процессора, дискового пространства и т. Д. В целом он обеспечивает опыт, который я бы описал как соединение VNC на основе терминала.
nohup
позволяет запускать задание в фоновом режиме с его выводом, направленным в файл журнала, который всегда можно перенаправить в / dev / null, если не требуется.