Windows Serverで更新プログラムの問題が出たのもつかの間。
更新プログラムの適用で再起動時にシャットダウンが進まなくなった時にやったことをご報告します。
平たく言えば…
一言で言ってしまうと、シャットダウンを妨げているプロセスを強制終了して、シャットダウンを進めた、というやり方です。強制終了することの是非はありますので、自身の環境でやって良いかどうかは適宜判断する必要があります。
以前に
ここでWindows Server 2008時代にやった内容が活きてきました。今回の対象はWindows Server 2016。OSの世代が進んでも、やり方は通用しました。
症状
前回画面がとれなかったので、今回は画面を取得。
シャットダウンはこの画面で停止していました。症状自体は前回と同一で「Hyper-V Virtual Machine Management」が「停止処理中」なので、プロセスとしては「C:\Windows\system32\vmms.exe」が対象になります。
そうなると、
別のコンピュータからservices.mscで確認するも、右クリックからは停止や再起動などはグレーアウトされており、操作はできない状態。
そこでpsexec.exeを使って、コマンドラインからtasklistコマンドでプロセスの状態を確認。
下の方をスクロールして探っていくと、
見つかりました。このvmms.exeが止まればOKのはず。
タスクを停止させる
さっそく前回と同じ方法で、やってみますが…。
ん?拒否されてしまいました…。アクセス元PCが悪かったか…。
そこで前回<シャットダウン中に処理が進まなくなった場合にもPsExec - treedown’s Report>に
「「taskkillはリモートシステムのタスクを落とせるのでpsexecを使う必要がない。」
という考え方もあります。(使ったことありませんが)実際にオプションにあります。」
という項で調べてあった別のやり方を試してみることにしました。
今回はリモート経由で別のコンピュータからtasklistコマンドでプロセス停止を試行します。
テンプレート:
TASKKILL /S system /U username /P password /IM "IMAGENAME" /F
- system⇒taskkill発行対象となるコンピュータ名(名前解決できればFQDNで無くてもOK)
- username⇒tasklistコマンドを実行するユーザ名、Active Directory環境なら「domain\username」形式で記述
- password⇒上記usernameのパスワード、必要なら入れるがcmd.exeを実行しているログインユーザがそのままリモート実行先で有効なら省略可能(今回は省略)
- IMAGENAME⇒taskkill対象のプロセス名、今回はvmms.exeを。
最後に「/F」強制オプションを付けます。
今回はこういう感じで実行。
taskkill /S ComputerNAME /U username /IM "vmms.exe" /F
無事、プロセスは強制終了され、OS再起動が進行しました。
まとめ
RPCサービスが動作している状態であれば、リモートからservices.mscでサービスの状態を確認して、コマンドプロンプトから、リモートのサービスに対してtasklistコマンドでプロセスを停止することはできる、ということが実践できました。