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