Удержание процесса linux после выхода из системы

Я подключаюсь к машине Linux через SSH, и я пытаюсь запустить тяжелый сценарий bash, который делает операции с файловой системой. Ожидается, что он будет работать в течение нескольких часов, но я не могу оставить сеанс SSH открытым из-за проблем с подключением к Интернету, которые у меня есть.

Я сомневаюсь, что запуск сценария с помощью оператора background, амперсанд ( & amp; ), сделает трюк, потому что я попробовал его, а позже обнаружил, что процесс не был завершен. Как я могу выйти из системы и продолжить работу?

136 голосов | спросил rahmanisback 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 10:00:40 +0400 2011, 10:00:40

9 ответов


130

Лучший способ - запустить процесс в терминальном мультиплексоре. В качестве альтернативы вы можете заставить процесс не получать сигнал HUP.


A терминальный мультиплексор предоставляет «виртуальные» терминалы, которые работают независимо от «реального» терминала (фактически все терминалы сегодня являются «виртуальными», но это еще одна тема для другого дня). Виртуальный терминал будет продолжать работать, даже если ваш реальный терминал закрыт вашей сессией ssh.

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

Два популярных терминальных мультиплексора: экран и tmux .

Экран имеет крутую кривую обучения. Вот хороший учебник с диаграммами, объясняющими концепцию: http: //www. ibm.com/developerworks/aix/library/au-gnu_screen/


Сигнал HUP (или SIGHUP) отправляется терминалом во все его дочерние процессы когда терминал закрыт. Общее действие при получении SIGHUP - прекращение. Таким образом, когда ваш сеанс ssh отключается, все ваши процессы завершатся. Чтобы этого избежать, вы можете заставить ваши процессы не получать SIGHUP.

Два простых метода для этого: nohup и < a href = "https://en.wikipedia.org/wiki/Disown_(Unix)" rel = "nofollow noreferrer"> disown .

Подробнее о том, как работают nohup и disown , читайте этот вопрос и ответ: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

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

ответил lesmana 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 10:05:54 +0400 2011, 10:05:54
92

Есть несколько способов сделать это, но наиболее полезным я считаю использование GNU Screen .

После запуска ssh запустите screen . Это запустит другую оболочку, запущенную на экране. Запустите команду, затем выполните Ctrl - a d .

Это отключит вас от сеанса экрана. На этом этапе вы можете выйти из системы или сделать что-либо еще, что хотите.

Если вы хотите повторно подключиться к сеансу экрана, просто запустите screen -RD из командной строки (как тот же пользователь, который создал сеанс).

ответил EEAA 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 10:07:25 +0400 2011, 10:07:25
70

В bash ключевое слово disown отлично подходит для этого. Сначала запустите свой процесс в фоновом режиме (используйте & amp; или ^ Z ), затем введите bg ):

  $ wget --quiet http: //server/some_big_file.zip & amp;
[1] 1156
 

Набрав jobs , вы увидите, что процесс все еще принадлежит оболочке:

  $ jobs
[1] + Запуск wget
 

Если вы вышли из системы в этот момент, фоновая задача также будет убита. Однако если вы запустите disown , bash отменит задание и продолжит работу:

  $ disown
 

Вы можете подтвердить это:

  $ jobs
$ logout
 

Вы можете даже комбинировать & amp; и disown в одной строке, например:

  $ wget --quiet http: //server/some_big_file.zip & amp; отрекаться
$ logout
 

Это лучше, чем запуск nohup , по моему мнению, потому что он не оставляет файлы nohup.out , замусоренные по всей вашей файловой системе. Кроме того, nohup должен быть запущен перед запуском команды - disown можно использовать, если вы решите позже, чтобы предпочесть фону и отделить задачу. р>

ответил Jeremy Visser 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 16:27:00 +0400 2011, 16:27:00
37

Инструмент nohup, доступный на большинстве Linux-боксов, сделает это.

ответил Korjavin Ivan 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 10:14:50 +0400 2011, 10:14:50
27

Чтобы быть основательным, я укажу tmux , который имеет ту же основную идею, что и экран

  

tmux предназначен для современной, BSD-лицензированной альтернативы программам, таким как экран GNU. Основные функции:

     
  • Мощный, последовательный, хорошо документированный и удобный скриптовый интерфейс.
  •   
  • Окно может быть разбито горизонтально и вертикально на панели.
  •   
  • Панели можно свободно перемещать и изменять размеры или размещать в предустановленных макетах.
  •   
  • Поддержка терминалов UTF-8 и 256 цветов.
  •   
  • Скопируйте и вставьте несколько буферов.
  •   
  • Интерактивные меню для выбора окон, сеансов или клиентов.
  •   
  • Измените текущее окно, выполнив поиск текста в целевом объекте.
  •   
  • Блокировка терминала, вручную или после таймаута.
  •   
  • Чистая, легко расширяемая BSD-лицензионная кодовая база под активной разработкой.
  •   

Это, однако, примерно бесконечно проще искать в Google.

ответил Handyman5 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 10:23:52 +0400 2011, 10:23:52
11

Экран - это избыток для простого поддержания процессов при выходе из системы.

Попробуйте dtach :

  

dtach - это программа, написанная на C, которая эмулирует функцию отсоединения   экран, который позволяет выполнять программу в среде, которая   защищен от управляющего терминала. Например, программа   под управлением dtach не будет влиять терминал, являющийся   по какой-то причине отключен.

     

dtach был написан, потому что экран не соответствовал моим потребностям; я   не нужны дополнительные функции экрана, такие как поддержка нескольких   терминалов или поддержки эмуляции терминала. экран был слишком большим,   громоздкий и имел исходный код, который было трудно понять.

     Экран

также мешал моему использованию полноэкранных приложений, таких как   emacs и ircII из-за чрезмерной интерпретации потока   между программой и прилагаемыми терминалами. dtach не имеет   уровня эмуляции терминала и передает исходный выходной поток   программы к присоединенным терминалам. Единственная входная обработка, которая   dtach выполняет сканирование для символа отсоединения (какие сигналы   dtach для отсоединения от программы) и обработки ключа приостановки   (который сообщает dtach о временном приостановлении себя, не затрагивая   запущенная программа), и оба из них могут быть отключены, если это необходимо.

     

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

ответил sml 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 19:06:16 +0400 2011, 19:06:16
9

Вот способ демонстрации любого процесса оболочки, никаких внешних программ не требуется:

  (в то время как sleep 5, do date; done) <& amp; -> output.txt & amp;
 

Когда вы закроете сеанс, работа продолжит выполнение, о чем свидетельствует файл output.txt (который имеет буферизацию, поэтому для отображения ненулевого значения требуется некоторое время). Не забывайте убивать свою работу после тестирования.

Итак, все, что вам нужно сделать, это закрыть stdin и выполнить фоновое задание. Чтобы быть действительно хорошим, сначала cd /, чтобы вы не держались за монтирование.

Это работает даже при простое s в Solaris.

ответил w00t 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 16 Sep 2011 20:48:01 +0400 2011, 20:48:01
7

Команда at может быть полезна для такого рода ситуаций. Например, введите:

  в настоящее время
 

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

Вместо now вы можете указать время, необязательное с датой, или выражение времени, например now + 15 minutes . Подробнее см. man в .

ответил rjmunro 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 16 Sep 2011 12:23:09 +0400 2011, 12:23:09
7

byobu на Ubuntu - это хороший интерфейс для экрана. Нажав Ctrl - ? , вы получите список всех сочетаний клавиш. Он добавляет строку состояния, которая может быть полезна для просмотра загрузки ЦП, дискового пространства и т. Д. В целом это обеспечивает опыт, который я бы назвал подключением VNC на основе терминала.

nohup позволяет запускать задание в фоновом режиме, а его выход перенаправляется в файл журнала, который всегда может быть перенаправлен на /dev /null, если это не требуется.

ответил John Beckett 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 17:26:09 +0400 2011, 17:26:09

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132