В чем разница между nohup и амперсандом

180

Оба nohup myprocess.out & или myprocess.out & устанавливают myprocess.out для запуска в фоновом режиме. После того как я выключил терминал, процесс все еще работает. Какая разница между ними?

  • 0
    какую оболочку вы используете? поведение меняется в зависимости от оболочки
  • 1
    Баш. И теперь я знаю почему, согласно ответу @nemo.
Показать ещё 2 комментария
Теги:
nohup

6 ответов

244
Лучший ответ

nohup захватывает сигнал зависания (см. man 7 signal), в то время как амперсанд не работает (кроме того, что оболочка скомпонована таким образом или вообще не отправляет SIGHUP).

Как правило, при запуске команды с использованием & и выходе из оболочки после этого оболочка завершает субкоманду с сигналом зависания (kill -SIGHUP <pid>). Этого можно предотвратить с помощью nohup, поскольку он улавливает сигнал и игнорирует его, чтобы он никогда не доходил до фактического приложения.

Если вы используете bash, вы можете использовать команду shopt | grep hupon, чтобы узнать, ваша оболочка отправляет SIGHUP своим дочерним процессам или нет. Если он выключен, процессы не будут как вам кажется. Дополнительная информация о завершении bash приложения можно найти здесь.

Бывают случаи, когда nohup не работает, например, когда процесс, который вы начинаете повторно подключать сигнал SIGHUP, как это имеет место здесь.

30

myprocess.out & будет запускать процесс в фоновом режиме с использованием подоболочки. Если текущая оболочка завершается (скажем, путем выхода из системы), все подоболочки также прекращаются, поэтому фоновый процесс также прекращается. Команда nohup игнорирует сигнал HUP, и, даже если текущая оболочка будет завершена, подселлем и myprocess.out будет продолжать работать в фоновом режиме. Другое отличие состоит в том, что только & не перенаправляет stdout/stderr, поэтому, если есть какой-либо вывод или ошибка, они отображаются на терминале. nohup, с другой стороны, перенаправляет stdout/stderr на nohup.out или $HOME/nohup.out.

  • 4
    Я запускаю myprocess.out & и myprocess.out & из оболочки. Тем не менее, когда я использую ps aux | grep myprocess.out в другой оболочке, я все еще могу найти "myprocess.out". Это значит, что процесс еще не запущен, а не прекращается.
  • 0
    @amit_g При уничтожении родительской оболочки с помощью kill -9 не будет SIGHUP, так как для этого потребуется родительская оболочка для обработки SIGKILL, чего не может быть.
Показать ещё 1 комментарий
19

В большинстве случаев мы заходим на удаленный сервер с помощью ssh. Если вы запустите оболочку script и вы выходите из системы, процесс будет убит. Nohup помогает продолжить запуск script в фоновом режиме даже после выхода из оболочки.

Nohup command name &
eg: nohup sh script.sh &

Nohup захватывает сигналы HUP. Nohup не выполняет задание автоматически в фоновом режиме. Нам нужно сказать, что явно используя &

  • 0
    Благодарю. Не ожидал вашего ответа, но тот факт, что он здесь, великолепен. Он отвечает на вопрос, который я не задавал: D
19

Использование амперсанда (&) будет запускать команду в дочернем процессе (дочерний элемент для текущего сеанса bash). Однако при выходе из сеанса все дочерние процессы будут убиты.

используя nohup + ampersand (&), сделает то же самое, за исключением того, что при завершении сеанса родительский элемент дочернего процесса будет изменен на "1", который является процессом "init", таким образом сохраняя ребенка из будучи убитым.

3

Исправьте меня, если я ошибаюсь

  nohup myprocess.out &

nohup ловит сигнал зависания, что означает, что он отправит процесс, когда терминал будет закрыт.

 myprocess.out &

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

nohup myprocess.out

Процесс может работать даже с закрытым терминалом, но вы можете остановить процесс, нажав ctrl + z в терминале. Crt + z не работает, если существует &.

1

Команда nohup - это утилита маскировки сигнала и захватывает сигнал зависания. Где, как амперсанд, не обхватывает сигналы зависания. Оболочка завершит команду sub с сигналом зависания при запуске команды, использующей и выходящей из оболочки. Это может быть предотвращено с помощью nohup, поскольку он улавливает сигнал. Команда Nohup принимает сигнал зависания, который может быть отправлен в процесс ядром и заблокирован. Команда Nohup полезна в том случае, когда пользователь хочет запустить долгое завершение работы приложения или закрыть окно, в котором был инициирован процесс. Любое из этих действий обычно побуждает ядро ​​зависать в приложении, но оболочка nohup позволит продолжить процесс. Использование амперсанда будет запускать команду в дочернем процессе и этот дочерний элемент текущего сеанса bash. Когда вы выйдете из сеанса, все дочерние процессы этого процесса будут убиты. Амперсанд относится к управлению заданиями для активной оболочки. Это полезно для запуска процесса в сеансе в фоновом режиме.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню