Вкратце: эта статья покажет вам, как вы можете запустить процесс и поддерживать его работу даже после того, как вы вышли из системы с помощью команды nohup.
Краткое резюме
Nohup означает «no hang up». Это чрезвычайно полезная команда для запуска процесса даже после выхода из системы.
Одно из наиболее распространенных применений можно найти в выполнении команд, требующих времени, через соединение SSH. Если вы считаете, что ваш SSH-сеанс может прерваться, вы можете использовать команду с nohup следующим образом:
nohup your_command &
Nohup можно рассматривать как обертку. Префикс вашей команды с nohup:
nohup COMMAND ARGS ....
Цель Nohup в том чтобы перехватить и предотвратить SIGHUP сигналы от достижения команды.
Когда вы префиксируете свою команду nohup, ввод будет перенаправлен из нечитаемого файла ( nohup COMMAND </dev/null ). Проще говоря, не вызывайте команду с nohup, если вам нужно отправить входные данные для этой команды. Когда вы запускаете команду Nohup, он должен быть в состоянии работать без присмотра.
Nohup сначала попытается перенаправить вывод в ./nohup.out или отправит его в ~/nohup.out, если это будет необходимо. Вы также можете решить, куда перенаправить вывод следующим образом:
nohup COMMANDS >/path/to/output/file
О nohup говорить особо нечего, у него нет длинного списка опций. Есть только –help и –version.
Выполнение скрипта с помощью 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 COMMAND &
Одна из распространенных проблем заключается в том, что иногда SSH «зависает» при выходе из системы. Это связано с тем, что SSH часто отказывается терять любой поток данных в фоновые процессы и из них. Затем он будет «зависать», пока процесс не будет завершен.
Эту проблему часто можно решить, перенаправив все 3 потока данных.
nohup COMMAND >./nohup.out 2>./nohup.err
Мы надеемся, что эта быстрая статья помогла вам лучше использовать сеансы SSH. Если у вас есть вопросы или предложения, пожалуйста, оставьте комментарий ниже.
Вот за это спасибо: “nohup COMMAND >./nohup.out 2>./nohup.err”