Вчора я вже не перший раз зіткнувся з кумедною проблемою в Windows Server 2008 - після виходу з FAR Manager у мене залишилося висіти консольне окно- «зомбі».
Таке вікно має справді чудову властивість - його не можна закрити. Крім того, якщо у вас з'явилося таке вікно, перезавантажити Windows у вас не вийде - всі ваші спроби будуть закінчуватися появою в Event Log повідомлення The attempt by user * * *\* * to restart/shutdown computer * * * failed.
На тлі цього відсутність відповідного процесу в списку завдань здається такою дрібницею...; -)
Моя вчорашня проблема ускладнювалася тим, що з'явилася якраз після деплойменту нової версії програми, і для його успішного завершення мені обов'язково потрібно було перезавантажити сервер. Коли я стикався з проблемою вікон- «зомбі» раніше, я зупиняв всі сервіси і перезавантажував сервер з харчування. Але вчора у мене такої можливості не було - сервер знаходився, м'яко кажучи, дуже далеко, IP-KVM до нього підключений не був, і місцевий персонал, який міг би застосувати до сервера крайні заходи впливу, також був недоступний.
До речі, утиліти shutdown і psshutdown я спробував в перші ж хвилини, ніякого ефекту. Судячи з усього, вони використовують все той же виклик ExitWindo^ Ex (), який розсилає безліч повідомлень, очікує на них відповіді і т. п.
У спішному порядку перекинувши додаток на інший сервер, я став шукати, як же можна вирішити цю проблему?
Поспілкувавшись з друзями, я з'ясував, що я не єдиний, хто стикався з цією проблемою, але рішення вони мені підказати не змогли, тому що так само, як і я, «вирішували» її відключенням живлення сервера.
Після того як я ще трохи покопався в i-net, у мене з'явилася підозра, хто винен у моїх муках - якщо вірити VS Debugger Team, проблема викликана помилкою в csrss (Client/Server Runtime Subsystem), і з'явилася вона більше року тому, після виходу оновлення KB978037, і в цій же статті KB наведена bothx. І незважаючи на те, що в списку операційних систем, які ця помилка зачіпає, Windows Server 2008 відсутня, симптоми дуже схожі.
На жаль, встановлення кола підозрюваних мало наблизило мене до вирішення проблеми, і я продовжив свої пошуки. Дуже швидко я знайшов інформацію, що в Windows 2000 була функція «Emergency Shutdown»:
HOW TO: Perform an Emergency Shutdown in Windows
http://support.microsoft.com/kb/279134/en-us
На жаль, через інтерфейс, що змінився, мені не вдалося з'ясувати, чи залишилася така функція в Windows Server 2008 (пошук за словами «emergency shutdown windows 2008» ніяких результатів не приніс), але ось дискусія 10-ти річної давності на web-сайті CodeGuru, присвячена цій функції, наштовхнула мене на думку скористатися перезвантаження.
Проконсультувавшись про всяк випадок з Марком Руссиновичем (в його друкованій іпостасі; -), я вирішив, що так, це те, що треба! І взявши за основу код, який Alex Fedotov (на жаль, посилання на його home page зараз не працює... але, можливо, він прочитає цей пост, і я зможу висловити йому подяку?) навів у згаданій вище дискусії, я написав невелику утиліту, злегка облагороджений варіант якої можна завантажити за посиланням в кінці посту.
І ця утиліта мені допомогла! А якби я ще примудрився перевірити її роботу на спеціально запущеній для цього віртуалці, а не на своїй робочій станції, втративши при цьому деякі незбережені дані, я б був просто шалено щасливий!; -)
До речі, вже після того, як я вирішив проблему, на форумі TechNet мені запропонували ще один варіант, а саме - виконати утиліту shutdown від імені системного еккаунту, але працездатність цього варіанту я поки не перевірив.
Завантажити утиліту Force Reboot (початковий код + бінарник)
