Shutdown nepocka na ukonceni vsech procesu
Dan Lukes
dan at obluda.cz
Sun Feb 18 15:20:02 CET 2007
Radim Kolar wrote:
> Dival jsem se do zdrojaku a neni mne jasne, kde se tohle da nastavit.
> prikaz shutown vypisuje jen hlasky a pak zavola halt nebo reboot (coz
> je stejny program) a ten zadny uzivatem nastavovatelny parametr jak
> dlouho cekat nema:
Restart/Stop systemu je slozita vec na ktere kooperuje nekolik urovni
systemu. To by bylo na dlouho. Takze co ten shutdown ? Ten skutecne
nedela nic jineho, nez, ze pise uzivatelum, ve vhodnou chvili zablokuje
dalsi prihlasovani a nakonec zavola reboot.
Reboot zavola sync(), zablokuje moznost dalsiho prihlasovani z
lokalnich konzoli, vsem nesystemovym procesum posle SIGTERM *). Za
dalsich 5-62 vterin (podle strankovaci aktivity) posle vsem nesystemovym
procesum SIGKILL. To udela az petkrat s odstupem 2*i (kde i je poradove
cislo pokusu), tedy celkem 42 sekund. Zadny ze zminenych casovych udaju
neni konfigurovatelny.
Pote zavola systemove volani reboot() a to uz je jadro. A co tedy dela
jadro. To i nastale situaci vyrozumi ruzne komponenty jadra, ktere si
tuto informaci "objednaly" (pokdu je objednanou akci "zastreleni
systemoveho procesu" pak delka, kterou ma takovy proces na svuj odchod
je rizena sysctl kern.shutdown.kproc_shutdown_wait. Pak uz kernel jen
syncne disky a opravdu masinu otoci. Explicitne zminim, ze 'init' je
sice specialni a systemovy proces, ale stale je to user-level proces,
nikoliv komponenta jadra - zminene "vyrozumeni" se ho tedy netyka.
Reknu to jeste jednou -
*** INIT se o vznikle situaci nijak nedozvi ***
- a nemuze nijak reagovat. Kdyby se o tom dozvedel (ale v tomto scenari
se to nedozvi) pak by
1. spustil rc.shutdown a nasledne cekal sysctl
kern.init_shutdown_timeout na jeho dokonceni
2. vsem nesystemovym procesum poslal SIGTERM *)
3. o nejvyse deset sekund pozdeji vsem nesystemovym procesum poslal SIGKILL
4. o dalsich nejvyse deset sekund pozdeji zavolal sync()
5. po dvou sekundach zavolal reboot()
---------------
RESTART/STOP systemu je tak treba delit na "init driven" a "restart
driven". Prvni se vyvola stiskem CRTL+ALT+DEL, spustenim 'init 6' nebo
'kill -INT 1' - ten spusti rc.shutdown a bude cekat dobu dle sysctl na
dokonceni. Druhy se vyvola volanim reboot (resp. halt pripadne jeho
frontendy jako je shutdown) - ten postrili scripty bez scriptu a casove
intervaly nejsou konfigurovatelne.
A to jsem vynechal zvlastni "emergency" varianty (reboot -n, reboot -q)
a varianty vyvolane abnormalnimi stavy (zanik procesu init, panic, ...)
Toz tak. Psal jsem, ze to restart neni trivialni operace ...
Dan
*) Volanim kill(-1, SIGTERM). Z manualu:
-------
If pid is -1:
If the user has super-user privileges, the signal is sent to all
processes excluding system processes (with P_SYSTEM flag set),
process with ID 1 (usually init(8)), and the process sending the
signal.
-------
Neni to uplne pravda, ve skutecnosti je ze zaslani signalu vyjmut jeste
proces PID=0, ale to je v praxi jedno, protoze swapper je stejne systemovy.
More information about the Users-l
mailing list