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


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

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


137
2017-09-15 06:00


Источник




Ответы:


Лучший способ - запустить процесс в терминальном мультиплексоре. В качестве альтернативы вы можете заставить процесс не получать сигнал 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

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


130
2017-09-15 06:05



Мне нравится этот ответ, поскольку он обеспечивает решение как для интерактивных, так и для неинтерактивных ситуаций. В интерактивном случае, screen дает вам больше возможностей, но если вы используете authorized_keys чтобы позволить людям запускать сценарий удаленно через ssh, nohup вариант - это простой простой способ запуска сценария, который длится дольше, чем ssh сеанс, используемый для их запуска. - Mark Booth
@rahmanisback - Помните, что вы можете в любой момент изменить принятый ответ. Просто потому, что до сих пор ответ EricA проголосовали наиболее высоко, это не значит, что это лучший ответ для вас, и, действительно, ваш принятый ответ может побудить больше людей голосовать за него как хороший ответ. - Mark Booth
* Кашель * tmuxisbetter * кашель * - crasic
tmux > экран. Попробуй, ты никогда не вернешься. - h0tw1r3
@TheLQ - byobu является Экран GNU. Вы по-прежнему используете экран, просто с высоко настраиваемым .screenrc. - EEAA♦


Есть несколько способов сделать это, но тот, который я нахожу наиболее полезным, - это использовать Экран GNU,

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

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

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


92
2017-09-15 06:07



Потрясающие! Нежный ответ, спасибо ... - rahmanisback
Экран имеет целую группу команд, начиная с Ctrl-a. Если вы изучаете только один дополнительный, начните с «Ctrl-a?». Тогда вы не узнаете «Ctrl-a c» и «Ctrl-a n», - olafure
@olafure +1, спасибо. Похоже, экран будет из моего основного инструментария. - rahmanisback
tmux > экран. Попробуй, ты никогда не вернешься. - h0tw1r3
+1 для tmux. Я сдал экран 5 недель назад. - Bryan Hunt


В 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 могут быть использованы, если вы решите позже, чтобы предпочесть фону и отделить задачу.


70
2017-09-15 12:27



Это очень хороший ответ, 1+. Единственное предпочтение nohup или Screen было бы независимость bash и может использоваться с другой оболочкой. Но я буду придерживаться вашего подхода, когда я использую bash. - rahmanisback
Да - это bash-specific, поскольку bash - единственная оболочка, которую я когда-либо использовал. Интересно, поддерживают ли другие оболочки какие-либо подобные (например, запуск в фоновом режиме без nohup) - было бы фантастически, если бы кто-то мог опубликовать другие ответы для других оболочек. - Jeremy Visser
см. мой ответ, показывающий, как сделать это с любым sh-lookalike - w00t
+1 из-за возможности решить позже. Только в этот момент у меня возникла необходимость в этом. работал как рекламируемый - code_monk


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


37
2017-09-15 06:14



Это самый простой ответ. Любой вывод из него автоматически направляется в nohup.out и может быть рассмотрен позже. - Julian
nohup вообще не требует zsh. - Aaron Brown
nohup - правильный ответ, он не подходит для зависания. - Kinjal Dixit
nohup находится на гораздо большем количестве машин, чем экран, поэтому вы должны знать, как его использовать. - Zenon


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

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

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

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


27
2017-09-15 06:23



С помощью "gnu screen" так как ваш поисковый запрос работает достаточно хорошо. - gnur
+1000 для tmux! - mbq


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

Пытаться dtach:

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

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

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

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


11
2017-09-15 15:06



Спасибо. Я приехал сюда только для публикации о dtach. Теперь это мое дело для терминальной отряды; экран слишком много работает и вмешивается в ввод в нелепой степени. Экран факсов нуждается в собственном termcap, который вызывает беспокойство. - fluffy


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

( while sleep 5; do date; done ) <&- >output.txt &

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

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

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


9
2017-09-16 16:48



Интересно. Появились некоторые важные вопросы. Я вижу, что вы установили STDIN в никуда, - оператор? В чем разница между < /dev/null а также &- ? Я предполагаю, что STDIN (и другим STDOUT и STDERR) может быть назначен либо файлом < file, или поток <& stream в случае STDIN. Будет ли такое же использование < /dev/null в вашем примере выше? И делает ли оператор - выше ссылаются на нуль как поток? - rahmanisback
Когда вы выполняете x <& -, это закрывает дескриптор файла x. В этом случае нет x, что делает bash по умолчанию равным 1, то есть стандартным вводам. Если вы используете </ dev / null, вы не закрываете stdin, вы просто вводите пустой файл в программу в качестве входных данных. - w00t
И, честно говоря, я действительно не знаю, почему это демонизирует то, что вы используете :-) Это действительно работает, мы используем его в производстве. Я обнаружил это, в то время как возился, надеясь, что смогу демонизировать процесс в оболочке, не требуя ничего особенного, поэтому я начал с закрытия stdin, и этого было достаточно. Я должен прочитать некоторые источники оболочки, но я полагаю, что если вы закроете процесс stdin и background, он также отключит процесс. - w00t
Я думаю, что причина в том, что SIGHUP (фактический сигнал, который заставляет ребенка прекращать работу, когда оболочка умирает) запускается, когда родительский процесс закрывает дескриптор stdin своего ребенка. Однако, если stdin начинается как null, а не закрывается после факта, родительский способ не может инициировать SIGHUP. Приятно найти, хотя - никогда бы не подумал об этом. - Jeremy Visser
@JeremyVisser, который звучит правдоподобно! - w00t


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

at now

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

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


7
2017-09-16 08:23





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

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


7
2017-09-15 13:26