Как использовать команду nohup в Linux
линукс nohup Команда позволяет продолжать важные процессы, даже если окно терминала, которое их запустило, закрыто. Мы покажем вам, как использовать эту почтенную команду в текущей версии Linux.
HUP и SIGHUP
Unix, предок Linux, был создан до изобретения ПК. Компьютеры были большими и дорогими устройствами. Люди общались с ними по последовательным линиям либо локально в том же здании, либо удаленно по медленным модемным соединениям. Первоначально они печатали свои инструкции на телепринтерах, которые постепенно были заменены тупыми терминалами.
Их называли глупыми, потому что вычислительная мощность находилась в компьютере, к которому вы были подключены, а не в терминале, на котором вы печатали. Программы работали на компьютере — где бы он ни находился, — а не на устройстве на вашем столе.
Если что-то произошло, что привело к потере связи между вашим терминалом и компьютером, компьютер обнаружил разрыв линии и HUP или же повесить трубку сигнал программам, которые вы запускали. Программы прекращали работу, когда получали сигнал.
Эта функциональность живет в Linux и сегодня. Окно терминала на вашем ПК представляет собой эмуляцию физического терминала. Если в этом окне терминала запущены процессы, и вы закрываете это окно SIGHUP сигнал посылается программам, чтобы они знали о HUP и знаю, что они должны остановиться.
Имеет место каскадный эффект. Если процессы запустили дочерние процессы, им также будет передан сигнал SIGHUP, сообщающий им о необходимости их завершения.
nohup команда запускает дочерние процессы, но отказывается проходить SIGHUP сигналы им. Это может показаться проблемой, но на самом деле это полезная функция.
Команда nohup
Если вы хотите, чтобы процесс продолжался, даже если окно терминала, из которого он был запущен, закрыто, вам нужен способ SIGHUP чтобы программа никогда его не получила. (На самом деле окно терминала не запускает процессы, они запускаются сеансом оболочки в окне терминала.) Простое и элегантное решение этой проблемы — поместить другой процесс между сеансом оболочки и программой и сделать это для имеют. программа среднего уровня никогда не возвращает SIGHUP сигнал.
Что это nohup делается. Он запускает программы для вас, чтобы они были дочерними элементами nohup , а не дочерний процесс оболочки. Поскольку они не являются дочерними процессами оболочки, они не получают напрямую SIGHUP из оболочки. И если nohup не проходит SIGHUP для своих детей программа не получает SIGHUP нисколько.
Это полезно, если, например, у вас есть длительный процесс, который необходимо завершить. Если вы случайно закроете окно терминала и его оболочку, вы также завершите процесс. С использованием nohup чтобы запустить процесс, изолируйте процесс от nohup сигнал. Если вы работаете удаленно на компьютере через SSH и не хотите, чтобы важный процесс был завершен в случае сбоя удаленного подключения, запустите процесс на удаленном компьютере с помощью nohup †
используя nohup
Мы создали программу, которая не делает ничего полезного, но продолжает работать до тех пор, пока не завершится. Он печатает время в окне терминала каждые три секунды. Это называется long-proc для «долгого процесса».
./long-proc
Если бы это была программа, которая делает что-то полезное, и мы хотели бы, чтобы она продолжала работать, даже когда окно терминала и оболочка закрыты, мы бы запускали ее с помощью nohup †
nohup ./long-proc
Процесс отключен от stdin а также stdout поэтому он не может получать ввод или писать в окно терминала. Поскольку он все еще работает, вы не вернетесь в командную строку. Все это nohup делает процесс нечувствительным к закрытию терминала. Это не превращает процесс в фоновую задачу.
Теперь вам нужно перезагрузиться, чтобы завершить процесс? Нет. Чтобы остановить nohup процесс, который вы не запускали как фоновый процесс, нажмите комбинацию клавиш Ctrl+C.
Вывод программы записывается для нас в файл с именем «nohup.out». Мы можем судить об этом по меньшему.
less nohup.out
Все, что обычно отправляется в окно терминала, фиксируется в файле. последующие прогоны nohup будет добавлен в существующий файл «nohup.out».
Более удобный способ запустить процесс — запустить его с nohup чтобы он мог выдержать закрытие окна терминала и одновременно сделать его фоновой задачей. Для этого добавляем амперсанд “ & » в конце командной строки.
nohup ./long-proc &
Вам нужно снова нажать «Enter», чтобы вернуться в командную строку. Нам сказали, что номер задания процесса — 1 — число в скобках». [] «— и что идентификатор процесса — 13115.
Мы можем использовать один из них, чтобы завершить процесс. «Ctrl+C» теперь не работает, потому что программа не связана с окном терминала или оболочкой.
Если вы забыли номер задания, вы можете jobs команда, чтобы вывести список фоновых задач, запущенных из этого окна терминала.
jobs
Чтобы убить нашу работу, мы можем использовать . использовать kill команду и номер задания, перед которым ставится знак процента “ % “, похожий:
kill %1
После того, как вы закрыли окно терминала, вам нужно будет найти идентификатор процесса и использовать его с kill заказ. pgrep Команда находит идентификатор процесса для процессов, которые соответствуют указанному вами поисковому запросу. Ищем имя процесса.
pgrep long-proc
Теперь мы можем использовать идентификатор процесса, чтобы завершить процесс.
kill 13115
В следующий раз, когда вы нажмете «Enter», вам сообщат, что процесс завершен.
Теперь посмотрим на что? нет завершить процесс. Мы перезапустим его, а затем закроем окно терминала.
nohup ./long-proc
Если мы откроем новое окно терминала и найдем наш процесс с помощью pgrep , мы видим, что он все еще работает. Закрытие окна терминала, запустившего процесс, не дало никакого эффекта.
pgrep long-proc
Можно передать несколько команд: nohup , но обычно лучше запускать их отдельно. Это упрощает управление ими как фоновыми задачами. Команды не выполняются одновременно, они выполняются одна за другой. Выполнение не одновременное, а последовательное. Для того, чтобы они работали одновременно, вы должны запустить их отдельно.
Тем не менее, используйте для запуска нескольких процессов одновременно nohup чтобы запустить оболочку Bash и использовать -c (commands) с последовательностью команд. Используйте одинарные кавычки “ ‘ “упаковать список команд и двойные амперсанды” && », чтобы разделить команды.
nohup bash -c 'ls /bin && ls /sbin'
Если вы используете less чтобы просмотреть файл «nohup.out», вы увидите вывод первого процесса, а затем вывод второго процесса.
less nohup.out
Вывод обеих команд записывается в файл «nohup.out». Он не переплетается, вывод второго процесса не начинается, пока не завершится первый процесс.
Если вы хотите использовать свой собственный файл вместо «nohup.out», вы можете перенаправить команду в файл по вашему выбору.
nohup bash -c 'ls /bin && ls /sbin' > myfile.txt
Обратите внимание, что сообщение больше не говорит «добавить вывод в nohupo.out», а говорит «перенаправить stderr в stdout», и мы перенаправляем stdout в наш файл «myfile.txt».
Мы можем посмотреть в файл “myfile.txt” с меньше.
less myfile.txt
Как и прежде, он содержит вывод обеих команд.
Забавно, как история утилиты иногда может показаться, что она не имеет отношения к современности. nohup назначение — одно из них. Кое-что, созданное для решения проблем с отключением последовательной линии, по-прежнему полезно сегодняшним пользователям Linux на невероятно мощных машинах.
СВЯЗАННЫЕ С: 37 важных команд Linux, которые вы должны знать
Запуск в фоне
Ребят, такая задача, через терминал запускаю java -jar selenium-server-standalone-4.0.0-alpha-1.jar и он в терминале работает все как и положенно, но стоит мне закрыть терминал как сразу перестает работать. Как можно сделать чтобы это исполнялось в фоне даже при закрытом терминале? Сервер Debian 10
S1mba
02.03.22 19:54:59 MSK
targitaj ★★★★★
( 02.03.22 19:56:16 MSK )
Варианты, тысячи их:
- мультиплексор screen или tmux
- nohup
- юнит systemd
- supervisord
- контейнерезация
- …
В общем и целом, по-правильному, гуглить deploying java app
vvn_black ★★★★★
( 02.03.22 19:59:42 MSK )
Последнее исправление: vvn_black 02.03.22 20:06:08 MSK (всего исправлений: 3)
написать скрипт для системы управления демонами.
пусть он запускает и держит в рабочем состоянии.
так понимаю системд тогда пишем сервис системд
pfg ★★★★★
( 02.03.22 20:00:57 MSK )
java -jar selenium-server-standalone-4.0.0-alpha-1.jar >> selenium.log 2>&1 &
затем пишешь в терминал exit или жмёшь ctrl+d (это важно, не надо ждать пока он сам отвалится). Лог будет писаться в файл selenum.log.
Если лог не нужен — то так:
java -jar selenium-server-standalone-4.0.0-alpha-1.jar >> /dev/null 2>&1 &
Ещё можно так (если установлен nohup), иногда оно лучше работает чем варианты выше, но скорее всего разницы не будет:
nohup java -jar selenium-server-standalone-4.0.0-alpha-1.jar &
firkax ★★★★★
( 02.03.22 20:22:09 MSK )
Последнее исправление: firkax 02.03.22 20:23:34 MSK (всего исправлений: 1)
Ответ на: комментарий от firkax 02.03.22 20:22:09 MSK
А разве java -jar selenium-server-standalone-4.0.0-alpha-1.jar >> /dev/null 2>&1 & поможет? Ведь все равно когда закрою терминал она перестанет исполнятся. А мне необходимо чтобы она вечно работала, если свалится с ошитбкой то вновь перезапускалась.
S1mba
( 02.03.22 20:25:00 MSK ) автор топика
Ответ на: комментарий от S1mba 02.03.22 20:25:00 MSK
Надо не закрыть терминал а ввести в нём exit, я же написал.
Чтобы перезапускалась сделай скрипт selenium-autorestart.sh
#!/bin/sh while true; do java -jar selenium-server-standalone-4.0.0-alpha-1.jar echo "crashed, restarting" sleep 10 done
сделай chmod +x selenium-autorestart.sh
./selenium-autorestart.sh 1>> /dev/null 2>&1 &
firkax ★★★★★
( 02.03.22 21:02:53 MSK )
Ответ на: комментарий от firkax 02.03.22 21:02:53 MSK
То есть каждые 10 секунд будет просто перезапускаться java -jar selenium-server-standalone-4.0.0-alpha-1.jar ? А нельзя сделать так чтобы один раз запустило и работало, если приложение крякнется то перезапустило? Извините я полный нуб в этом. Вот пытаюсь понять и освоить материал но пока не получается
S1mba
( 02.03.22 23:46:53 MSK ) автор топика
Ответ на: комментарий от S1mba 02.03.22 23:46:53 MSK
Нет, не будет каждые 10 секунд, всё будет норм. Когда java упадёт, через 10 секунд запустится назад.
firkax ★★★★★
( 03.03.22 00:56:53 MSK )
Ответ на: комментарий от firkax 03.03.22 00:56:53 MSK
Что то пошло не так^ и выдает ошибку element not interactable (Session info: headless chrome=99.0.4844.51) . Теперь даже при ручном запуске java -jar selenium-server-standalone-4.0.0-alpha-1.jar стало выбивать ошибку эту ошибку Как можно остановить выполнение того скрипта?
Команда Nohup в Linux позволяет запускать команды даже после выхода из системы
Вкратце: эта статья покажет вам, как вы можете запустить процесс и поддерживать его работу даже после того, как вы вышли из системы с помощью команды nohup.
Nohup означает «no hang up». Это чрезвычайно полезная команда для запуска процесса даже после выхода из системы.
Одно из наиболее распространенных применений можно найти в выполнении команд, требующих времени, через соединение SSH. Если вы считаете, что ваш SSH-сеанс может прерваться, вы можете использовать команду с nohup следующим образом:
Что такое команда nohup?
Nohup можно рассматривать как обертку. Префикс вашей команды с nohup:
nohup COMMAND ARGS .
Цель Nohup в том чтобы перехватить и предотвратить SIGHUP сигналы от достижения команды.
Nohup сначала попытается перенаправить вывод в ./nohup.out или отправит его в ~/nohup.out, если это будет необходимо. Вы также можете решить, куда перенаправить вывод следующим образом:
nohup COMMANDS >/path/to/output/file
О nohup говорить особо нечего, у него нет длинного списка опций. Есть только –help и –version.
Пример использования команды Nohup
Выполнение скрипта с помощью nohup так же просто, как это.
nohup ./nhp.sh
Обратите внимание, что nohup не развил процесс в фоновом режиме. Nohup предназначен только для перехвата сигналов SIGHUP. После запуска команды вы можете продолжить и закрыть свой терминал. Он предупредит вас, что процесс запущен. Подтвердите, что хотите убить его.
Когда вы закрыли свой терминал, все дочерние процессы получили сигнал SIGHUP. Nohup помешал этому сигналу достичь нашей команды. На следующем рисунке показана информация о нашей команде, пока терминал еще работал.
Вы видите PPID? Это идентификатор родительского процесса. Когда вы запросили закрыть терминал, все дочерние элементы PPID получили сигнал SIGHUP. Nohup не дал этому сигналу дойти до нашего сценария. Родительский процесс завершен, и наш сценарий осиротел. Когда процесс становится осиротевшим, он автоматически получает 1 (systemd или init) в качестве родителя.
Как видите, продемонстрировать использование nohup не сложно. Очень простая команда. Вы можете разветвлять процесс в фоновом режиме следующим образом:
nohup ./nhp.sh &
Вы также можете решить, куда будет перенаправлен вывод:
nohup ./nhp.sh >/path/to/file &
Обратите внимание, что если вы выключите или перезагрузите систему Linux, она убьет команду. Когда вы запрашиваете завершение работы или перезагрузку, все процессы получают SIGTERM, а затем SIGKILL . Эти сигналы не будут перехвачены Nohup.
Nohup через соединение SSH
Одно из применений, которое часто приходит на ум сразу, когда вы изучаете nohup — это возможность запуска процесса на удаленном компьютере через SSH. Логично, что выполнение команды с nohup позволит вам выйти из вашего SSH-соединения, и процесс все равно будет запущен.
nohup COMMAND &
Одна из распространенных проблем заключается в том, что иногда SSH «зависает» при выходе из системы. Это связано с тем, что SSH часто отказывается терять любой поток данных в фоновые процессы и из них. Затем он будет «зависать», пока процесс не будет завершен.
Эту проблему часто можно решить, перенаправив все 3 потока данных.
nohup COMMAND >./nohup.out 2>./nohup.err
Мы надеемся, что эта быстрая статья помогла вам лучше использовать сеансы SSH. Если у вас есть вопросы или предложения, пожалуйста, оставьте комментарий ниже.
Как остановить nohup в linux
Все процессы, за исключением at и batch , завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup . Команда nohup имеет следующий формат:
nohup command &
Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем каталоге строки «word» и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:
nohup grep word * > word.list &
Вы можете завершить команду nohup с помощью команды kill .
Alex Otwagin 2002-12-16