Какви са последиците от стартирането на скрипт като демон спрямо използването на nohup?
Знам каква е разликата по отношение на процесите на разклоняване и т.н., но какво влияние има това върху моя скрипт?
Какви са последиците от стартирането на скрипт като демон спрямо използването на nohup?
Знам каква е разликата по отношение на процесите на разклоняване и т.н., но какво влияние има това върху моя скрипт?
Командата 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
, която ще демонизира програма, която не знае как да се демонизира (правилно). Беше написано, за да заобиколи дефектите в програма, която трябваше да се демонизира, но не свърши работата както трябва. Свържете се с мен, ако искате - вижте профила ми.
(nohup sleep 20 &)
, т.е. скобите го изключват от лидера на група процеси, така че да не получава сигнали за тази група процеси.
- person Maxim Egorushkin; 04.10.2011
perl -e 'system "ps -fjp $$"'
. Освен това амперсандът не е присъщ на nohup, така че дори това е разликата между nohup и daemon. Ще добавя свой собствен отговор с още повече разлики.
- person Kelvin; 18.01.2012
(nohup sleep 20 &)
правят разлика. Те определят под-обвивка. Вътре в подобвивката командата nohup
изпълнява командата sleep
във фонов режим. Когато се върне, под-черупката излиза, така че sleep
е осиротяла, вече не е „притежание“ на текущата обвивка.
- person Jonathan Leffler; 18.01.2012
Да станеш демон
Тази връзка съдържа добър списък от стъпки, които процесът трябва да предприеме, за да стане демон:
https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Не мога да копирам списъка дословно поради авторски права (вижте секцията Информация), но ето резюмето:
fork
(първи път) -- така че ние не сме лидер на групата и нека родителят да излезе.setsid()
-- за да станете лидер на нова сесия. Това обаждане работи само ако не сме лидер на група. Тази нова сесия няма управляващ терминал.fork
(втори път) -- така че ние не сме лидер на сесията (и следователно не можем да си върнем контролния терминал) и оставяме родителя да излезе.cd
към основната директория -- така че не предотвратяваме демонтирането на други директории.umask
на желаната стойност (по избор) -- защото можехме да наследим маска, която не искахме.няма
Какво прави nohup
:
nohup.out
Прилики и разлики
Забележете как единствените обичайни действия са пренасочване на 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.
Освен това изглежда, че сигналите от клавиатурата, изпратени до терминал, се изпращат само до групата процеси, която го има като управляващ терминал.
Във вариантите на UNIX процесът е свързан с терминален процес (черупка за влизане). Така че, когато терминалният процес излезе, процесът също се спира поради тази асоциация. Nohup предотвратява излизането на процес, когато терминалът спре.
Демонът или демонът е процес, който се стартира от системата, когато се стартира, работи до изключване, никой потребител не го е поискал изрично. Така че по дефиниция не е част от потребителско взаимодействие, а принадлежи на системата.
Ако имате достъп до системата като потребител, можете да използвате nohup. Ако сте системен администратор, можете да инсталирате процес на демон. За процеса няма значение.
Демон не може да бъде иницииран, докато nohup се инициира от потребителя.