Лучший способ - запустить процесс в терминальном мультиплексоре. В качестве альтернативы вы можете заставить процесс не получать сигнал HUP.
Терминальный мультиплексор обеспечивает «виртуальные» терминалы , которые работают независимо от «реального» терминала ( на самом деле все терминалы сегодня «виртуальные» , но это уже другая тема для другого дня). Виртуальный терминал будет продолжать работать, даже если ваш реальный терминал закрыт с вашим сеансом SSH.
Все процессы, запущенные из виртуального терминала, будут продолжать работать с этим виртуальным терминалом. При повторном подключении к серверу вы можете подключиться к виртуальному терминалу, и все будет так, как будто ничего не произошло, кроме прошедшего времени.
Двумя популярными терминальными мультиплексорами являются screen и 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
Примечание: хотя процессы будут продолжать работать, вы больше не можете взаимодействовать с ними, потому что они больше не подключены ни к одному терминалу. Этот метод в основном полезен для длительных пакетных процессов, которые после запуска больше не нуждаются в вводе пользователем.
screen
предоставляет гораздо больше возможностей, но если вы используете,authorized_keys
чтобы позволить людям запускать сценарий удаленно с помощьюssh
, этотnohup
параметр является хорошим простым способом для сценария запускать процессы, которые длятся дольше, чемssh
сеанс, используемый для их запуска. ,Есть несколько способов сделать это, но наиболее полезным я считаю использование экрана GNU .
После того, как вы в ssh, бегите
screen
. Это запустит другую оболочку, работающую на экране. Запустите вашу команду, затем выполните Ctrl- a d.Это «отключит» вас от сеанса экрана. На этом этапе вы можете выйти из системы или сделать все, что захотите.
Если вы хотите повторно подключиться к сеансу экрана, просто запустите
screen -RD
из командной строки (как и тот же пользователь, который создал сеанс).источник
В
bash
,disown
ключевое слово идеально подходит для этого. Сначала запустите ваш процесс в фоновом режиме (либо используйте&
, либо^Z
введитеbg
):Набрав,
jobs
вы можете увидеть, что процесс по-прежнему принадлежит оболочке:Если вы выйдете из системы на этом этапе, фоновая задача также будет уничтожена. Однако, если вы запустите
disown
, bash отсоединит задание и позволит продолжить его выполнение:Вы можете подтвердить это:
Вы можете даже объединить
&
иdisown
в одной строке, например:По
nohup
моему мнению, это лучше, чем работать, потому что это не оставляетnohup.out
файлы засоренными по всей вашей файловой системе. Кроме того,nohup
должен быть запущен до запуска команды -disown
может быть использован, если вы только позже решите, что вы хотите в фоновом режиме и отсоединить задачу.источник
Инструмент nohup, доступный в большинстве Linux-боксов, сделает это.
источник
Просто чтобы быть точным, я укажу на tmux , который имеет ту же основную идею, что и screen:
Однако поиск в Google примерно бесконечно проще.
источник
"gnu screen"
качестве поискового запроса работает довольно хорошо.Экран излишне просто для того, чтобы поддерживать процессы запущенными при выходе из системы.
Попробуй дтач :
источник
Вот способ демонизации любого процесса оболочки, не требующий внешних программ:
Когда вы затем закроете сеанс, задание продолжит выполняться, о чем свидетельствует файл output.txt (в котором есть буферизация, поэтому для отображения ненулевого значения требуется некоторое время). Не забудьте убить свою работу после тестирования.
Поэтому все, что вам нужно сделать, это закрыть стандартный ввод и выполнить задание. Чтобы быть действительно хорошим, во-первых,
cd /
чтобы вы не держались за гору.Это работает даже в простой sh под Solaris.
источник
-
оператор? В чем разница между< /dev/null
и&-
? Я предполагаю, что STDIN (и другие STDOUT и STDERR) могут быть назначены либо файлом< file
, либо потоком<& stream
в случае STDIN. Будет ли это так же, как< /dev/null
в вашем примере выше? И оператор-
выше ссылается на нуль как поток?Команда
at
может быть полезна для такой ситуации. Например, введите:И затем вы можете ввести команду или серию команд, которые будут выполняться. Результаты должны быть отправлены вам по электронной почте, если на аппарате правильно настроена электронная почта.
Вместо этого
now
вы можете указать время, необязательно, с датой или с помощью выражения времениnow + 15 minutes
. Смотритеman at
для более подробной информации.источник
byobu
на Ubuntu хороший интерфейс для экрана. При нажатии Ctrl- ?вы получите список всех сочетаний клавиш. Он добавляет строку состояния, которая может быть полезна для наблюдения за загрузкой процессора, дисковым пространством и т. Д. В целом, он предоставляет опыт, который я бы описал как терминальное соединение VNC.nohup
позволяет запускать задание в фоновом режиме с выводом его в файл журнала, который всегда может быть перенаправлен в / dev / null, если не требуется.источник