Когато стартирате текстов редактор лесно можете да го контролирате, да заредите файлове и т.н. Можете да го направите защото редактора предоставя тази възможност и защото е стартиран в terminal. Някои програми не са с дизайн за интерактивна работа с потребителя, те прекъсват връзката си с терминала. Например, уеб сървър прекарва целия си ден в отговор на уеб заявки, нормално не се нуждае от никакви команди от вас. Програми транспортиращи електронна поща от сървър на сървър са друг пример за този тип приложения.
Тези програми се наричат daemons. Демоните са герои от гръцката митология; нито добри нито лоши, малки духове които като цяло са правели добри неща. Почти като днешните уеб и майл сървъри вършещи добри неща. Това е причината BSD талисмана да е весело изглеждащ демон с вила и кецове.
Има конвенция за именуването на програми които нормално се стартират като демони - името им да завършва с ``d''. BIND е Berkeley Internet Name Daemon (и програмата която всъщност изпълнява се нарича named), Apache уеб сървърът се нарича httpd, демона за отпечатване (line printer spooling daemon) е lpd и т.н. Това е просто конвенция, не твърдо правило; например главния пощенски демон за приложението Sendmail се нарича sendmail а не maild както бихте очаквали.
Понякога се налага да комуникирате с процеса на демон. Тези комуникации се наричат сигнали и чрез тях можете да комуникирате с демони (или всеки друг стартиран процес) като му изпратите сигнал. Има няколко възможни сигнала които можете да изпратите-- някои от тях имат специфично значение, други се интерпретират от приложението, документацията към конкретното приложение ще ви каже как ще бъдат интерпретирани сигналите. Можете да изпращате сигнали само на приложения които притежавате. Ако се опитате да изпратите сигнал на процес които не притежавате с kill(1) или kill(2) той ще бъде отказан. Изключение е root потребителя който може да изпраща сигнали на всеки процес.
FreeBSD също може да изпраща сигнали на процеси в някои случаи. Ако приложение е лошо написано и се опитва да получи достъп до част от паметта която не притежава, FreeBSD ще изпрати на процеса Segmentation Violation (нарушаване на сегмента) сигнал (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.
Как да откриете ID на процеса до които искате изпратите сигнал. Това може да бъде направено чрез ps(1) и grep(1). Командата grep(1) се използва за търсене на низ в резултат върнат от друга програма. Тази програма се изпълнява като нормален потребител а inetd(8) е като root, така че опийте ax трябва да бъдат зададени на ps(1).
% ps -ax | grep inetd 198 ?? IWs 0:00.00 inetd -wW
Както виждате inetd(8) PID е 198. В някои случаи grep inetd командата също може да се появи в изхода. Причината за това е начина по които ps(1) намира списъка с стартираните в момента процеси.
Използвайте kill(1) за да изпратите сигнала. Поради факта, че inetd(8) е стартиран като root трябва най-напред да използвате su(1) за да станете root.
% su Password: # /bin/kill -s HUP 198
Както и повечето UNIX® команди, kill(1) няма да отпечата нищо ако изпълнението е завършило успешно. Ако изпратите сигнал на процес които не притежавате, ще видите ``kill: PID: Operation not permitted''. Ако объркате номера на процеса или ще прекратите изпълнението на грешен процес, което може да е много лошо, или ако имате късмет може да сте изпратили сигнала до процес които не съществува и ще видите ``kill: PID: No such process''.
Защо се използва /bin/kill?: Много обвивки (шелове) предоставят kill команда като вградена команда; това означава, че шела ще изпрати командата директно вместо да извика /bin/kill. Това може да бъде много полезно, но различните шелове имат различен синтакс за задаването на сигнала които трябва да се изпрати. Вместо да се опитвате да научите всички тях, можете просто да използвате /bin/kill ....
Изпращането на други сигнали е много подобно, просто заменете TERM или KILL в командната линия както е необходимо.
Important: Прекратяването на случаен процес в системата може да бъде много лоша идея. По специално init(8), процес ID 1, е много специален. Изпълняването на /bin/kill -s KILL 1 е сигурен начин да прекратите работата на вашата система. Винаги проверявайте два пъти аргументите с които стартирате kill(1) преди да натиснете Return.
| [1] |
Не е много вярно-- има няколко неща които не могат да бъдат прекъсвани. Например, ако процес се опитва да чете от файл които се намира на друг компютър в мрежата и другият компютър не е достъпен поради някаква причина (бил е изключен или мрежата не е достъпна) тогава процеса е регистриран като ``непрекъсваем''. Евентуално времето без отговор на процеса ще изтече (обикновено около две минути). Веднага след като това време изтече, процеса ще бъде прекратен. |
Този и други документи можете да намерите в ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
За въпроси относно FreeBSD, прочетете документацията преди да попитате в <questions@FreeBSD.org>.
За въпроси относно този документ, e-mail <doc@FreeBSD.org>.