Systemd администратор, част 4

4. Убий демона

Kill система демон не е трудно, нали? Or. Това не е толкова просто?
Ако си демон работи като единен процес, той наистина е много проста. Можете командва killall rsyslogd и дневника на системата демон спира. Въпреки това, този метод не е съвсем вярно, тъй като това се отразява не само на самия демон, но и на други процеси, свързани с едно и също име. Понякога такова поведение може да доведе до неприятни последици. По-правилно да се използва PID-файл:


$ Kill (котка /var/run/syslogd.pid)

Това е, както всичко, което ви трябва. Или ни липсва нещо друго?
В действителност, ние забравяме едно просто нещо: има услуги като Apache, crond, ATD, които поради естеството на дейността на услуги трябва да се работи за деца процеси. То може да бъде абсолютно излишно, определен от програмата на потребителя (например, Cron / при задачи, CGI-скриптове) или пълни сървърни процеси (например, Apache работници). Когато те убия основния процес, той може да спре всички деца процеси. И не мога да спра. В действителност, ако услугата функционира нормално, обикновено е спрян от команда за спиране. За да убие директно предизвикателство към администратора, който обикновено се използва само при спешни случаи, когато услугата не работи правилно и не може да отговори на стандартната стоп команда.
По този начин, убийството, например, основната Apache сървъра, можете да се откъснете от наследена работи на CGI-скриптове, както и на техните родители автоматично ще стане PID 1 (първоначален), така че да се установи техния произход не е толкова лесно.
systemd бърза да ни помогне. Systemctl убие команда ви позволява да изпрати сигнал до всички процеси, които се генерират, като част от тази услуга. Например:


# Systemctl убийство crond.service

Можете да бъдете сигурни, че всички процеси Cron услуги ще бъдат изпратени SIGTERM на сигнала. Разбира се, можете да изпращате и всеки друг сигнал. Например, ако вашият бизнес наистина много лошо, и можете да използвате SIGKILL:


# Systemctl убие -s SIGKILL crond.service

След въвеждане на тази команда, Cron услуга е жестоко убит, заедно с всички деца процесите си, независимо от това колко пъти тя forkan, и без значение колко го опитвали да избягат от под наш контрол с двойно вилица или вилица-бомбардировките.
Прибл. Транс. Трябва да се отбележи, че използването на контролни групи опростява не само процеса на унищожаване на кар-бомби, но също така значително намалява щетите, причинени от работа вилица-бомба. От systemd автоматично поставя всяка услуга и всеки потребител сесия в контролната група на ресурс от време на процесора, стартирането вилката бомби един потребител или услуга няма да създаде значителни проблеми с отзивчивостта на системата за другите потребители и услуги. Така, както е сериозна заплаха вилица-бомбардиране са единствените възможни процеси изтощение памет и идентификатор (PID). Въпреки това, и те също могат да бъдат лесно отстранени: достатъчно, за да се създадат подходящи ограничения на конфигурацията на услугите файл (вж systemd.exec (5).).
В някои случаи е необходимо да се изпрати сигнал до първичния процес на името на услугата. Например, с помощта на SIGHUP, ние може да принуди демона отново да четат конфигурационни файлове. Разбира се, предава HUP спомагателни процеси в този случай не е необходимо. За решаването на този проблем, добра форма и класически метод PID-файл, но systemd и в този случай има просто решение, което премахва необходимостта от търсене на желания файл:


# Systemctl убие -s HUP --kill-кой = главната crond.service

Така че, това, което носи по принципно нова systemd в рутинен процес демон убийството на? На първо място, за първи път в историята на Linux осигурява метод за принудително спиране на услугата, която не зависи от това доколко вярно основния процес на обслужване, за да изпълни задълженията си, за да спре процесите на детето. Както бе споменато по-горе, е необходимо да се изпрати SIGTERM или SIGKILL процес обикновено се случва точно в извънредна ситуация, когато не може да бъде сигурен, че демонът е правилно изпълняват всички свои задължения.
След като прочетох по-горе, може да се питам: каква е разликата между systemctl убийство и systemctl спре? Разликата е, че убийството просто изпраща сигнал към указания процес, а стоп актовете на "официално" специфичен метод, причиняващи командата, определена в параметър ExecStop служебната конфигурация. Обикновено се спре команда е достатъчно, за да спре услугата, и да убие трябва да се прибягва само в крайни случаи, например когато услугата се "затвори" и не реагира на команди.
Между другото, при използване на «-s», можете да посочите имената на сигнала като префикс на SIG, и без него - и двата варианта ще работят.
В заключение, си струва да се казва, че за нас е много интересно и изненадващо, е фактът, че преди появата на systemd за Linux не съществува инструменти за правилно изпрати сигнал до службата като цяло, а не на отделни процеси.