Демони, сигнали, процеси на убиване

Ние наричаме тези програмидемони. Daiemons са герои от гръцката митология; добри или лоши, те са били спътници на човека и най-общо казано са вършели полезна работа за хората. Точно както уеб и мейл сървърите вършат полезна работа днес. Това е и причината талисманът на BSD отдавна да е весел демон по чехли и с вила.

Съществува конвенция, че името на програма, която обикновено работи като демон, завършва с ``d''.BINDе Berkeley Internet Name Daemon (изпълнимият файл се нарича named), програмата на уеб сървъраApacheсе нарича httpd, демонът на спулера за печат е lpd и т.н. Това е конвенция, а не твърдо правило; например основният пощенски демон заSendmailсе нарича sendmail, а не maild, както си мислите.

Понякога може да е необходимо да взаимодействате с процеса на демон. Това може да се направи съссигнали, т.е. взаимодействат с демони (или други работещи процеси), като им изпращат сигнал. Има много различни сигнали -- някои от тях имат специално значение, други се обработват от приложението, чийто отговор на тези сигнали трябва да бъде документиран. Можете да изпращате сигнали само към процеси, които притежавате. Ако изпратите сигнал до друг процес с kill (1) или kill (2), достъпът ще бъде отказан. Изключение от правилото е root потребителят, който може да изпраща сигнали до всеки процес.

В някои случаи FreeBSD също изпраща сигнали до приложения. Ако дадено приложение е написано зле и се опитва да получи достъп до област от паметта, до която не трябва да има достъп, FreeBSD изпраща сигналнарушение на сегментирането(SIGSEGV) към процеса. Ако приложението използваalarm(3) системно повикване за получаване на известие след определен период от време, ще бъде изпратен сигнал за аларма (SIGALRM) и т.н.

Могат да се използват два сигнала за прекратяване на процес, SIGTERM и SIGKILL. SIGTERM е правилният начин за прекратяване на процес; процесът може дауловисигнала, да определи, че иска да прекрати, да затвори всички файлове, които може да е отворил, и да завърши всичко, което е правил в момента, преди да бъде затворен. В някои случаи даден процес може дори да игнорира SIGTERM, ако изпълнява задача, която не може да бъде прекъсната.

SIGKILL не може да бъде игнориран от процес. Този сигнал гласи „Не ме интересува какво правиш – спри сега“. Ако изпратите SIGKILL на процес, FreeBSD незабавно ще убие този процес [1] .

Други сигнали, от които може да се нуждаете, са SIGHUP, SIGUSR1 и SIGUSR2. Това са сигнали с общо предназначение и различните приложения може да реагират различно на тях.

Да приемем, че сте променили конфигурационния файл на уеб сървъра -- сега трябва да му кажете да препрочете конфигурацията. Възможно е да спрете и стартирате httpd, но това ще доведе до моментно изключване на сървъра, което може да не е желателно. Повечето демони са написани да препрочитат конфигурационните файлове, когато получат сигнал SIGHUP. Така че вместо да убивате и стартирате httpd, можете да изпратите сигнал SIGHUP. Тъй като няма стандартен начин да се отговори на този сигнал, различните демони ще се държат различно; прочетете документацията на демона за това.

Сигналите се изпращат с помощта на командата kill (1), както е показано в този пример.

Изпращане на сигнал до процес

Този пример показва как да изпратите сигнал към inetd(8) . inetd конфигурационен файл /etc/inetd.conf, inetd ще прочете отновотози файл, ако към него е изпратен сигнал SIGHUP.

Трябва да определите PID на процеса, към който искате да изпратите сигнала. Направете това с ps (1) и grep (1). Командата grep(1) се използва за търсене на даден низ в изходния поток. Тази команда се изпълнява като нормален потребител и inetd(8) се изпълнява като root, така че ps(1) трябва да се изпълнява с опцията axe.

Така че PID на inetd (8) е 198. В някои случаи grep inetd може също да се появи в изхода на командата. Това се дължи на начина, по който ps(1) получава списъка с изпълнявани процеси.

Използвайте kill(1), за да изпратите сигнал. Тъй като inetd(8) се изпълнява като root, първо трябва да използвате su(1), за да получите root права.

Като повечето UNIX ® команди, kill (1) няма да направи нищо, ако работи добре. Ако изпратите сигнал към процес, който не притежавате, на екрана ще се появи „kill: PID: Operation not permitted“. С грешно въведен PID или ще изпратите сигнал до друг процес, което може да доведе до проблеми, или, ако имате късмет, ще бъде изпратен сигнал до PID, който в момента не се използва -- екранът ще покаже ``kill: PID : Няма такъв процес''.

Защо да използвате /bin/kill?:Много черупки имат вградена команда kill; по този начин, вместо да извика /bin/kill, обвивката сама изпраща сигнала. Това може да бъде много полезно, но различните обвивки определят името на сигнала по различен начин. Вместо да се опитвате да ги научите всички, много по-лесно е да използвате /bin/kill. директно.

Изпращането на други сигнали е много подобно, просто заменете TERM или KILL в командния ред с името на друг сигнал.

Важно:Произволното убиване на процеси може да е лоша идея. По-специално, init (8), чийто PID е 1, има специално значение. Изпълнение на /bin/kill -s KILL 1 -- бързоначин за рестартиране на системата.Винагипроверявайте повторно опциите за стартиране на kill (1)предида натиснете Enter.

Не е съвсем правилно - има няколко действия, които не могат да бъдат прекъснати. Например, ако даден процес се опитва да прочете файл на друг компютър в мрежата и другият компютър не отговаря по някаква причина (бил е изключен или е имало грешка в мрежата), процесът е в това, което е известно като „състояние на непрекъсваемост“. В крайна сметка времето за изчакване ще изтече, обикновено след две минути. След като времето изтече, процесът ще бъде убит.