Czy proces root root kill (proces z pid 1)? Jakie byłyby tego konsekwencje?
Domyślnie nie, to niedozwolone. W systemie Linux (od man 2 kill
):
Jedynymi sygnałami, które można wysłać do ID procesu 1, procesu init, są te, dla których init wyraźnie zainstalował procedury obsługi sygnałów. Ma to na celu zapewnienie, że system nie zostanie przypadkowo wyłączony.
Pid 1 (init) może zdecydować, że pozwala się zabić, w takim przypadku „zabójstwo” jest w zasadzie prośbą o wyłączenie się. Jest to jeden z możliwych sposobów realizacji halt
polecenia, chociaż nie jestem świadomy, init
że to robi.
Na komputerze Mac zabicie launchd
(jego analog analogowy) sygnałem 15 (SIGTERM) natychmiast uruchomi ponownie system, nie zawracając sobie głowy czystym zamykaniem uruchomionych programów. Zabicie go przy pomocy nie dającego się złapać sygnału 9 (SIGKILL) nic nie robi, pokazując, że kill()
semantyka Maca jest pod tym względem taka sama jak semantyka Linuksa.
W tej chwili nie mam pod ręką pudełka z Linuksem, z którym chciałbym eksperymentować, więc pytanie o to, co Linux A init
robi z SIGTERMem, będzie musiało poczekać. init
ponieważ projekty zastępcze, takie jak Upstart i Systemd, są obecnie popularne, odpowiedź może być różna.
AKTUALIZACJA : W systemie Linux init
jawnie ignoruje SIGTERM, więc nic nie robi. @jsbillings ma informacje o tym, co robią Upstart i Systemd.
init
zSegmentation fault
(SIGSEGV
sygnał), co spowoduje panikę jądra:kill -SEGV 1
Inicjalizacja SysV ignoruje sygnały SIGKILL lub SIGTERM. Jedynym sygnałem, który powoduje zmianę stanu, jest SIGPWR, o ile wiem, który planuje wyłączenie związane z zasilaniem.
Wygląda na to, że Upstart i Systemd również nie reagują na SIGKILL, a z mojego testu wynika, że SIGTERM powoduje ponowne uruchomienie i systemd ponownie.
Nie jestem pewien, co robią inni odpowiadający, ale jestem prawie pewien, że nie możesz zabić -9 (SIGKILL) lub zabić -15 (SIGTERM) init (pid 1). Najprawdopodobniej, gdybyś mógł, dostaniesz panikę jądra, ponieważ init nieoczekiwanie zakończył pracę z niezerowym kodem wyjścia, co byłoby mniej niż idealne. Nie wyłącza komputera ani nie powoduje jego ponownego uruchomienia.
źródło
Technicznie tak, root może wydać SIGKILL do init. init jednak różni się od większości, prawie wszystkich innych procesów, tym, że dozwolone jest wychwytywanie i ignorowanie sygnału.
Możesz, luźno, zabić init, wydając
kill -TERM 1
analogiczny do wydania ahalt
lubshutdown
w tym init przekaże sygnał wszystkim dzieciom, zasadniczo wszystkim innym procesom, zanim uhonoruje sam sygnał.Uwaga: wykonanie tego polecenia spowoduje zamknięcie systemu.
Dla smaku; jednym rodzajem innego procesu, który może „zignorować” SIGKILL, jest nieprzerwany sen, taki jak czekanie na we / wy. Taki proces można znaleźć, wydając
ps axo stat,comm
procesy, w których procesy o statusie „D” są nieprzerwane.źródło
kill -TERM 1
nic nie zrobię, ale spowoduje, że init zrestartuje się na większości systemów Linux, i że jedyną rzeczą, którą możesz zrobić, aby system zamknął twój system, jest uruchomieniekill -PWR 1
kill -TERM 1
zdecydowanie powoduje ponowne uruchomienie komputera (faktycznie przechodzę przez::shutdown:
wpis i powiązany skrypt w inittab.)Możesz ponownie uruchomić
init
proces. Jest to przydatne do wprowadzania zmianinittab
bez konieczności ponownego uruchamiania.Źródło: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/
źródło
init
wiem, że ten sygnał nie powoduje ponownego uruchomienia procesu, a jedynie ponowne załadowanie/etc/inittab
pliku. --- Przeciwnie,systemctl daemon-reexec
naprawdę sprawia, żesystemd
(init
zamiennik w systemie Linux), aby wykonać ponownie.sudo kill -INT 1
(przerwanie) zrestartuje system, asudo kill -SEGV 1
(naruszenie segmentacji) lubsudo kill -ABRT 1
(przerwanie) wygeneruje panikę jądra.Uwaga: wymagane jest sudo.
źródło
Cóż, root może zabić proces inicjowania w systemie Linux:
Detale:
kill -9 1
nie działa:Więc uruchommy
strace
:źródło
SIGKILL
doPID1
od github.com/torvalds/linux/commit/... została połączona.Wpisz
sudo kill -INT 1
, a następnie zobacz, co się stanie.źródło