Какова функция команды nohup?

18

Я новичок в Ubuntu. Я выучил команду

nohup [command]- работать <command>невосприимчивым к сигналу зависания

Я не могу понять значение слова « невосприимчив к сигналу зависания ». О каком типе сигнала идет речь? И, пожалуйста, скажите мне, как использовать эту команду с примером.

coding_ninza
источник
Если доступно в вашей оболочке, disownэто лучшая альтернатива nohup. Фоновая команда с помощью command &или Ctrl-Z, затем используйте, disownчтобы отделить ее от оболочки.
Джон Кугельман поддерживает Монику
@JohnKugelman, что недостаточно , вы также должны перенаправить поток ввода, вывода и ошибок. Так почему бы не использовать nohup, который сделает это автоматически?
чудо173

Ответы:

34

Давайте рассмотрим, как вы открыли geditтекстовый редактор из терминала и работаете над ним. Если вы закрываете терминал перед закрытием gedit, gedit также закрывается сразу после закрытия терминала. и так, что здесь происходит? geditРаботает как дочерний процесс под терминалом. Когда вы закрываете терминал, в процесс отправляется сигнал об окончании ( SIGHUP), который убивает дочерний процесс.

С другой стороны, если вы хотите, чтобы ваш дочерний процесс (здесь gedit) продолжал работать даже после закрытия родительского терминала, вы хотели бы, чтобы ваш процесс был защищен от сигнала зависания. Так что закрытие терминала не закрывает дочерний процесс. nohupделает именно эту работу.

nohupне отключает команду от терминала , это заставляет ваш скрипт игнорировать SIGHUP и перенаправляет stdout / stderr в файл nohup.out, чтобы команда могла продолжить работу в фоновом режиме после выхода из системы. Если вы закрываете оболочку / терминал или выходите из системы, ваша команда больше не является дочерней для этой оболочки. Это относится к процессу инициализации. Если вы выполните поиск, pstreeвы увидите, что он принадлежит процессу 1 (init). Это не может быть возвращено на передний план, потому что передний план больше не существует.

souravc
источник
16

Помимо того, что написал @sourvac, это наследие Back In The Day, когда люди заходили в систему только через текстовые немые терминалы, часто через (оригинальный, аналоговый 110 бод) модем: «зависание» буквально «вешает трубку» ».

Пид, невосприимчивый к сигналу зависания, будет продолжать работать даже после того, как вы выйдете из системы и повесите трубку . Это было очень полезно на медленных компьютерах, когда задания выполнялись часами и часами, и вы не могли просто оставаться в системе (кому-то еще нужно было использовать терминал, вам нужно было использовать телефон, статическая связь в линии могла бы «поднять» соединение , и т.д).

RonJohn
источник
1
Не только в тот день. Я выполняю большинство своих больших заданий в кластере серверов, в который я помещаю ssh. Если бы я не использовал nohup, мне пришлось бы оставить свой ноутбук подключенным к этим машинам на несколько дней, ожидая окончания работы.
Рэй
@Ray как насчет запуска их через "at" или как cron-задания?
RonJohn
@RonJohn Конечно. Или через движок сетки. Я не хотел предполагать, что nohup был единственным вариантом, просто он все еще используется для этой цели сегодня.
Рэй
1
Возможно, ваши исторические замечания верны. Но ваши выводы о его нынешнем значении неверны. Это не полезно на медленных компьютерах, но полезно для длительных работ. Это две разные вещи. Вы используете «nohup», чтобы защитить свою работу от намеренного или непреднамеренного отключения вашего терминала. Даже в наши дни вы недовольны тем, что работа прерывается, потому что ошибка сети отключает ваш терминал, а ваша работа прерывается.
чудо173
Работа @Ray Cron совершенно не подходит для этого. Cronjobs для периодических задач, вы должны установить окружение в cronjob и рассмотреть много других вещей. Возможно, «at» немного проще в обращении, но, тем не менее, сложнее, чем nohup.
чудо173