Каква е разликата между nohup и демон?

Какви са последиците от стартирането на скрипт като демон спрямо използването на nohup?

Знам каква е разликата по отношение на процесите на разклоняване и т.н., но какво влияние има това върху моя скрипт?


person Hortitude    schedule 05.06.2009    source източник


Отговори (4)


Командата nohup е начинът на горкия човек да стартира процес като демон. Както отбеляза Bruno Ranschaert, когато изпълнявате команда в интерактивна обвивка, тя има управляващ терминал и ще получи сигнал SIGHUP (прекъсване), когато контролният процес (обикновено вашата обвивка за влизане) излезе. Командата nohup урежда входните данни да идват от /dev/null и както изходът, така и грешките да отиват в nohup.out, и програмата да игнорира прекъсвания, сигнали за излизане и прекъсвания. Всъщност все още има същия управляващ терминал - той просто игнорира контролите на терминалите. Обърнете внимание, че ако искате процесът да се изпълнява във фонов режим, трябва да кажете на обвивката да го изпълнява във фонов режим - поне на Solaris (т.е. въвеждате 'nohup sleep 20 &'; без амперсанда процесът работи синхронно в преден план).

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

Обикновено (което означава, че ако се опитате много, можете да намерите изключения от тези правила), процесът на демон е нещо, което се крие във фонов режим, прекъснато от който и да е терминал, но чака да отговори на някакъв вид въвеждане. Мрежовите демони чакат заявките за свързване или UDP съобщенията да пристигнат по мрежата, извършват подходящата работа и изпращат отговор отново. Помислете например за уеб сървър или СУБД.

Когато един процес напълно се демонизира, той преминава през някои от стъпките, през които преминава кодът nohup; той пренарежда своя I/O, така че да не е свързан към никакъв терминал, отделя се от групата процеси, игнорира подходящи сигнали (което може да означава, че не игнорира никакви сигнали, тъй като няма терминал, който да му изпрати някой от генерираните сигнали чрез терминал). Обикновено се разклонява веднъж и родителят излиза успешно. Дъщерният процес обикновено се разклонява за втори път, след като коригира своята група процеси и идентификатор на сесия и т.н.; след това детето също излиза. Процесът на внук вече е автономен и няма да се показва в изхода ps за терминала, където е стартиран.

Можете да разгледате Разширено програмиране в Unix среда, 3-то издание от W Richard Stevens и Stephen A Rago, или на Advanced Unix Програмиране, 2-ро издание от Marc J Rochkind за дискусии за демонизация.

Имам програма daemonize, която ще демонизира програма, която не знае как да се демонизира (правилно). Беше написано, за да заобиколи дефектите в програма, която трябваше да се демонизира, но не свърши работата както трябва. Свържете се с мен, ако искате - вижте профила ми.

person Jonathan Leffler    schedule 05.06.2009
comment
Не знам защо го наричате беден човек. Прави правилното нещо, ако искате да направите процеса си демон, освен това не прекъсва връзката с управляващия терминал, което на практика няма значение. Второ, вие го наричате погрешно, правилната форма е (nohup sleep 20 &), т.е. скобите го изключват от лидера на група процеси, така че да не получава сигнали за тази група процеси. - person Maxim Egorushkin; 04.10.2011
comment
@MaximYegorushkin Скобите не правят никаква разлика (доколкото виждам). Изпълнението на която и да е програма от шел винаги прави тази програма лидер на група. Опитайте това и ще видите, че PGID винаги съвпада с PID: perl -e 'system "ps -fjp $$"'. Освен това амперсандът не е присъщ на nohup, така че дори това е разликата между nohup и daemon. Ще добавя свой собствен отговор с още повече разлики. - person Kelvin; 18.01.2012
comment
@Kelvin: Скобите в (nohup sleep 20 &) правят разлика. Те определят под-обвивка. Вътре в подобвивката командата nohup изпълнява командата sleep във фонов режим. Когато се върне, под-черупката излиза, така че sleep е осиротяла, вече не е „притежание“ на текущата обвивка. - person Jonathan Leffler; 18.01.2012
comment
@JonathanLeffler Добре, сега виждам разлика - родителският PID е 1, а не PID на обвивката. Но все още не виждам никаква разлика в това да станеш лидер на група процеси. Освен това все още е част от същата сесия, така че не е напълно осиротяло. Във всеки случай, скобите не изглеждат подходящи за разграничението nohup/daemon. - person Kelvin; 18.01.2012

Да станеш демон

Тази връзка съдържа добър списък от стъпки, които процесът трябва да предприеме, за да стане демон:

https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

Не мога да копирам списъка дословно поради авторски права (вижте секцията Информация), но ето резюмето:

  1. fork (първи път) -- така че ние не сме лидер на групата и нека родителят да излезе.
  2. обадете се на setsid() -- за да станете лидер на нова сесия. Това обаждане работи само ако не сме лидер на група. Тази нова сесия няма управляващ терминал.
  3. fork (втори път) -- така че ние не сме лидер на сесията (и следователно не можем да си върнем контролния терминал) и оставяме родителя да излезе.
  4. cd към основната директория -- така че не предотвратяваме демонтирането на други директории.
  5. задайте umask на желаната стойност (по избор) -- защото можехме да наследим маска, която не искахме.
  6. затворете stdin, stdout, stderr (или просто ги отворете отново, за да сочат другаде)

няма

Какво прави nohup:

  • Ако stdout и stderr са свързани към терминал, пренасочва ги към nohup.out
  • игнорира SIGHUP

Прилики и разлики

Забележете как единствените обичайни действия са пренасочване на stdout и stderr. Да бъдеш демон дори не изисква игнориране на SIGHUP.

nohup не изисква да използвате '&' за фонов процес - което означава, че все още можете да използвате ctrl-c, за да изпратите SIGINT. Процесът все още отговаря на въвеждане от клавиатурата. Той също така не променя stdin автоматично, така че се препоръчва да го направите сами чрез "< /dev/null".

Моля, не бъркайте nohup с други функции, които обикновено се използват с него (напр. заден план). ОП попита специално за nohup.

На практика

От гледна точка на практичност, когато искате да стартирате еднократен продължителен процес, който трябва да продължи, когато обвивката излезе, ще искате да използвате nohup, но също така ще искате да го комбинирате с фоново и пренасочване на stdin. Еднократна работа не си струва да се направи демон, но някои от свойствата на демон все още могат да бъдат полезни с nohup работа, като "cd /".

Периодичните задачи по редовен график се изпълняват най-добре чрез cron (или друг планировчик).

Демоните са най-подходящи за наблюдение на повтарящи се задачи, които нямат предвидимо начално време. Обикновено няма определено крайно време за процеса демон (изрично е спрян от потребител/друг процес или чрез изключване на системата). Често демоните са услуги, които отговарят на приложения (клиенти) или други условия (напр. входящи данни чрез на IO устройство чрез unix select()). Други демони анкетират за условие и изпълняват действие в отговор.

Допълнение относно контролния терминал

Вижте тази страница. Кратко обобщение е, че управляващият терминал предоставя неограничен достъп до своите stdin, stdout, stderr. Само една група процеси може да има достъп до stdin. По подразбиране групите фонови процеси могат също да пишат в stdout и stderr.

Освен това изглежда, че сигналите от клавиатурата, изпратени до терминал, се изпращат само до групата процеси, която го има като управляващ терминал.

person Kelvin    schedule 18.01.2012
comment
Вашата връзка steve.org.uk не работи. - person QED; 16.01.2018

Във вариантите на UNIX процесът е свързан с терминален процес (черупка за влизане). Така че, когато терминалният процес излезе, процесът също се спира поради тази асоциация. Nohup предотвратява излизането на процес, когато терминалът спре.

Демонът или демонът е процес, който се стартира от системата, когато се стартира, работи до изключване, никой потребител не го е поискал изрично. Така че по дефиниция не е част от потребителско взаимодействие, а принадлежи на системата.

Ако имате достъп до системата като потребител, можете да използвате nohup. Ако сте системен администратор, можете да инсталирате процес на демон. За процеса няма значение.

person Bruno Ranschaert    schedule 05.06.2009
comment
+1 Поправям се. Смесено между демон и фонов процес (&). :) - person pugmarx; 06.06.2009
comment
Почти точно. Когато контролиращ процес (лидер на група) излезе, всички процеси в групата получават SIGHUP, последвано по избор от SIGCONT. - person Maxim Egorushkin; 04.10.2011
comment
Някои корекции: Не е необходимо демонът да е системен процес; непривилегирован потребител може да стартира демон. Потребителят може да взаимодейства с демон, но не чрез терминални сигнали и IO потоци (помислете за уеб сървър). Демоните могат да бъдат стартирани почти по всяко време; те не са ограничени до зареждане на системата. - person Kelvin; 18.01.2012

Демон не може да бъде иницииран, докато nohup се инициира от потребителя.

person swarna    schedule 10.08.2010