Linux nohup не работает

Обновлено: 03.07.2024

Я пытаюсь использовать команду «nohup», чтобы избежать прерывания фонового процесса при выходе из терминала в linux MATE.

Я хочу запустить процесс MPIrun, и я использую следующую команду:

Когда я выхожу из терминала, процессы, запущенные на разных ядрах, прекращаются.

Еще одна вещь, которую я заметил в файле журнала, заключается в том, что если я попытаюсь просто запустить следующую команду

А затем CTRL + Z (остановка процесса) файл журнала указывает:

И я не могу остановить команду mpirun. Думаю, я чего-то не понимаю в том, что делаю

2 ответа

Задание, выполняемое в фоновом режиме, по-прежнему принадлежит вашей оболочке входа в систему (команда nohup не завершается до завершения команды mpirun ), поэтому она получает сигнал при отключении. Я использую этот скрипт (я называю его bk ):

(Если вас интересует любопытство, обратите внимание на осторожное использование $* и "$@" . nice выполняет задание с более низким приоритетом, когда меня нет рядом. И версия 1.1 была проверена в управление версиями - SCCS в то время - 10 августа 1987 г.)

Для вашего процесса вы должны запустить:

Подсказка возвращается почти сразу. Ключевые различия между тем, что находится в этом коде, и тем, что вы делаете прямо из командной строки:

  1. Для сценария оболочки есть подпроцесс, который сразу же завершается.
  2. Сам сценарий запускает команду во вспомогательной оболочке в фоновом режиме.

Между ними это означает, что ваша оболочка входа в систему не вмешивается в процесс; он не знает о процессе внуков.

Запустив прямо из командной строки, вы должны написать:

Скобки начинают подоболочку; суб-оболочка запускает nohup в фоновом режиме с перенаправлением ввода-вывода и завершает работу. Команда continue - это внук вашей оболочки входа, и ваша оболочка входа в нее не вмешивается.

Я не эксперт в mpirun , никогда не использовал его, так что есть шанс, что он сделает что-то, чего я не ожидал. Мое впечатление от страницы руководства таково, что он действует более или менее как обычный процесс, хотя он может запускать несколько других процессов, возможно, на нескольких узлах. То есть он запускает другие процессы, но контролирует и координирует их и завершает работу только после завершения своих дочерних процессов. Если это верно, то то, что я изложил, достаточно точно.

Чтобы убить процесс, вам понадобится следующая команда. первый:

Это дает вам PID процесса, подобного этому

[1]+ 47274 Running nohup mpirun -np 8 solverName -parallel >log 2>&1

Затем выполните следующую команду, чтобы убить процесс.

Это поможет вам убить процесс.

Обратите внимание, что ctrl + Z не останавливает процесс, а приостанавливает его.

Для первой части вопроса я рекомендую попробовать эту команду и посмотреть, работает она или нет.

Я пытаюсь использовать команду nohup, чтобы избежать утечки фонового процесса при выходе из терминала в linux MATE.

когда я покидаю терминал, процессы, запущенные на разных ядрах, будут убиты.

Еще одна вещь, которую я заметил в файле журнала, заключается в том, что если я попытаюсь запустить только следующую команду

а затем в CTRL + Z (остановка процесса) файл журнала указывает:

и я не могу фактически остановить команду mpirun. Поэтому я думаю, что я не понимаю, что я делаю

Для вашего процесса вы должны запустить:

Приглашение возвращается почти сразу. Основные отличия между тем, что находится в этом коде, и тем, что вы делаете прямо из командной строки:

  1. Там есть подпроцесс для сценария оболочки, который прерывается быстро.
  2. Сам сценарий запускает команду в суб-оболочке в фоновом режиме.

Между ними это означает, что ваш процесс не вмешивается в ваш интерфейс; он не знает о процессе внуков.

Запустив прямо в командной строке, вы должны написать:

Скобки запускают подоболочку; суб-оболочка запускает nohup в фоновом режиме с перенаправлением ввода-вывода и завершает работу. Продолжающаяся команда является внуком вашей оболочки входа и не мешает вашей оболочке входа.

Я не эксперт в mpirun , никогда не использовал его, поэтому есть шанс, что он сделает то, чего я не ожидаю. Мое впечатление от страницы руководства состоит в том, что он действует более или менее как обычный процесс, даже если он может запускать несколько других процессов, возможно, на нескольких узлах. То есть, он управляет другими процессами, но контролирует и координирует их и только выходит, когда его дети полны. Если это правильно, то то, что я изложил, является достаточно точным.

Чтобы убить процесс, вам понадобится следующая команда. первый:

это дает вам PID процесса, подобного этому

[1]+ 47274 Running nohup mpirun -np 8 solverName -parallel >log 2>&1

затем выполните следующую команду, чтобы убить процесс.

это поможет вам убить процесс.

обратите внимание, что ctrl + Z не убивает процесс, но приостанавливает его.

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

Команда Nohup в Linux

Команда nohup выполняет другую программу, указанную в качестве аргумента, и игнорирует все SIGHUP сигналы (зависания). SIGHUP это сигнал, который отправляется процессу, когда его управляющий терминал закрыт.

Как использовать команду nohup

Синтаксис nohup команды следующий:

Команда не принимает никаких других опций, кроме стандартных --help и --version .

Давайте посмотрим на следующий пример:

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

Если вы выйдете из системы или закроете терминал, процесс не прекратится.


Запуск команды в фоновом режиме

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

Для запуска команды в фоновом режиме добавьте & символ в конце команды:

Вывод включает идентификатор задания оболочки (заключенный в квадратные скобки) и идентификатор процесса:

Вы можете использовать идентификатор задания, чтобы вывести команду на передний план, используя fg команду.

Если по какой-либо причине вы хотите прервать процесс, используйте kill команду, за которой следует идентификатор процесса:


Перенаправление вывода в файл


альтернативы

Есть несколько альтернативных программ, которые вы можете использовать, чтобы избежать прерывания команды при закрытии терминала или отключении.

Screen

Screen или GNU Screen - это программа мультиплексора терминала, которая позволяет запустить сеанс экрана и открыть любое количество окон (виртуальных терминалов) внутри этого сеанса. Процессы, запущенные в Screen, будут продолжать работать, когда их окно не видно, даже если вы отключены.

Tmux - современная альтернатива экрану GNU. С Tmux вы также можете создать сеанс и открыть несколько окон внутри этого сеанса. Сеансы Tmux являются постоянными, что означает, что программы, работающие в Tmux, продолжат работать, даже если вы закроете терминал.

Disown

disown является встроенной оболочкой, которая удаляет задание оболочки из управления заданиями оболочки. В отличие от nohup , вы также можете использовать disown на запущенных процессах.

Вывод

nohup позволяет предотвратить завершение команд при выходе или выходе из терминала.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Favorite

Добавить в избранное

Главное меню » Операционная система Linux » Команда Nohup в Linux позволяет запускать команды даже после выхода из системы

(1 оценок, среднее: 5,00 из 5)

Команда Nohup в Linux позволяет запускать команды даже после выхода из системы

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

Nohup означает «no hang up». Это чрезвычайно полезная команда для запуска процесса даже после выхода из системы.

Одно из наиболее распространенных применений можно найти в выполнении команд, требующих времени, через соединение SSH. Если вы считаете, что ваш SSH-сеанс может прерваться, вы можете использовать команду с nohup следующим образом:

Что такое команда nohup?

Nohup можно рассматривать как обертку. Префикс вашей команды с nohup:

Цель Nohup в том чтобы перехватить и предотвратить SIGHUP сигналы от достижения команды.

О nohup говорить особо нечего, у него нет длинного списка опций. Есть только –help и –version.

Пример использования команды Nohup

Выполнение скрипта с помощью nohup так же просто, как это.


Обратите внимание, что nohup не развил процесс в фоновом режиме. Nohup предназначен только для перехвата сигналов SIGHUP. После запуска команды вы можете продолжить и закрыть свой терминал. Он предупредит вас, что процесс запущен. Подтвердите, что хотите убить его.

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

Вы видите PPID? Это идентификатор родительского процесса. Когда вы запросили закрыть терминал, все дочерние элементы PPID получили сигнал SIGHUP. Nohup не дал этому сигналу дойти до нашего сценария. Родительский процесс завершен, и наш сценарий осиротел. Когда процесс становится осиротевшим, он автоматически получает 1 (systemd или init) в качестве родителя.

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

Вы также можете решить, куда будет перенаправлен вывод:

Обратите внимание, что если вы выключите или перезагрузите систему Linux, она убьет команду. Когда вы запрашиваете завершение работы или перезагрузку, все процессы получают SIGTERM, а затем SIGKILL . Эти сигналы не будут перехвачены Nohup.

Nohup через соединение SSH

Одна из распространенных проблем заключается в том, что иногда SSH «зависает» при выходе из системы. Это связано с тем, что SSH часто отказывается терять любой поток данных в фоновые процессы и из них. Затем он будет «зависать», пока процесс не будет завершен.

Эту проблему часто можно решить, перенаправив все 3 потока данных.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: