Windowsの運用管理を快適にする10の裏ワザ/表ワザ
[ テクニカルライター 山市 良 ]

テクニック.3 - メンテナンスタスクは確実に完了させること

2021年10月26日配信
2023年09月28日更新

yamaichi_tec003_top_1800x540

 

 通常、再起動が必要な更新プログラムをインストールする場合、コンピューターが再起動されることでその処理は完了します。しかし、次の更新プログラムがインストールされる前に、実行されていることが推奨されるメンテナンスタスクが残っています。

 

■ 自動ディスククリーンアップタスク

 Windows 8.1、Windows 10、デスクトップエクスペリエンス機能を追加したWindows Server 2012/2012 R2、およびWindows Server 2016以降のデスクトップエクスペリエンスでは、[タスクスケジューラ](Taskschd.msc)の以下の場所にあるSilentCleanupタスクが定期的に実行されるようになっています(画面1)。

¥Microsoft¥Windows¥DiskCleanup¥SilentCleanup

 SilentCleanupタスクは、コンピューターのアイドル時間にのみ実行され、アイドル状態でなくなると停止します。サーバーアプリケーションやインフラストラクチャサービスを実行するサーバーの場合、十分なアイドル時間が取れずにSlientCleanupタスクが完全に完了しない状態が続く可能性があります。

 特に、更新プログラムのインストール後のSlientCleanupタスクは、Windows Updateの不要なコンポーネントの削除やコンポーネントストア(C:¥Windows¥WinSxS)の最適化(ファイルの圧縮など)が行われるため、完全に完了するためには余計に多くの時間がかかります。

 

001

画面1 SilentCleanupタスクは、Windows Update直後の実行には時間がかかるため、
非アイドル状態になって途中で中止されることもある

 

 更新プログラムのインストールのために業務時間外に集中して作業を行える場合は、SlientCleanupが実行するのと同じ以下のコマンドラインを、管理者として開いたコマンドプロンプトで実行します。コマンドプロンプトはすぐに帰ってきますが、cleanmgr.exeプロセスは実行中になります。[タスクマネージャー](Taskmgr.msc)でcleamgr.exeプロセスが終了するまで待つとよいでしょう。

cleanmgr /autoclean /d C:

 [ディスククリーンアップ](cleanmgr.exe)を搭載しないServer Coreには、SlientCleanupタスクは存在しません。次のコマンドライン(/Resetbaseパラメーターは付けない)を実行することで、同様の効果を期待できます。

 DISM /Online /Cleanup-Image /StartComponentCleanup 

 

NGENタスク

 .NET Frameworkの累積的な更新プログラム(注:Windows 10バージョン1803以前に標準搭載される.NET Frameworkバージョンの更新プログラムはWindowsの累積更新プログラムに含まれます)がインストールされると、以下の場所にある2つのタスク(32ビットOSの場合は2つ目のみ)が“準備完了”状態にセットされ、コンピューターのアイドル時間に自動実行されます(画面2)。

¥Microsoft¥Windows¥.NET Framework¥.NET Framework NGEN v4.0.30319 64 Critical

¥Microsof¥Windows¥.NET Framework¥.NET Framework NGEN v4.0.30319 Critical

 

002

画面2 .NET Framework NGEN v4.0.30319 64 Critical(64ビット用)と.NET Framework NGEN v4.0.30319 Critical(32ビット用)は、.NET Frameworkの累積更新プログラムがインストールされると“準備完了”状態となり、実行が完了すると“無効”になる

 

 これらのタスクは、.NET Frameworkのマネージドアプリケーションのパフォーマンスを向上するために、ネイティブイメージを生成して、ローカルコンピューターのネイティブイメージキャッシュに格納します。キャッシュが作成されることで、ランタイム時にJust-In-Time(JIT)コンパイラを使用してイメージをコンパイルする代わりに、キャッシュ内のイメージを使用できるようになります。

 イメージキャッシュが存在しなければその時点でコンパイルされるため、これらのタスクが完了することは必須ではありません。しかし、これらのタスクの実行が次回のWindows Updateと重なると、システムの負荷が高まり、Windows Updateのインストール時間にも影響します。

 更新プログラムのインストールのために業務時間外に集中して作業を行える場合は、タスクの状態を確認し、“準備完了”状態の場合は手動で集中的に実行するとよいでしょう。管理者として開いたコマンドプロンプトで次の4行のコマンドラインを実行します。なお、32ビットOSの場合は、3、4行目の実行は不要です。バッチファイルを作成しておくと(ngen.cmdなど)、コマンドラインを連続実行できて便利です。

C:\Windows¥Microsoft.NET¥Framework¥v4.0.30319¥ngen.exe executeQueuedItems 

C:\Windows¥Microsoft.NET¥Framework¥v4.0.30319¥ngen.exe update 

C:\Windows¥Microsoft.NET¥Framework64¥v4.0.30319¥ngen.exe executeQueuedItems 

C:\Windows¥Microsoft.NET¥Framework64¥v4.0.30319¥ngen.exe update 

 

■サンプルスクリプト:PowerShellからプロセスの終了を監視する

 Cleanmgrなど、バックグラウンドで実行されるプロセスの状態を監視するPowerShellスクリプトです。

checkproc.ps1 (使用法:.\checkproc.ps1 <プロセス名(拡張子なし)>)

 param($target)

 while(1) {

 $procid = (Get-Process -ProcessName $target -ErrorAction  SilentlyContinue).Id

 if ($procid.Length -eq 0) {

 Write-Host $target "is not  running currently"

 break

 } else {

 Write-Host $target  "(PID:"$procid") is alive"

 }

 Start-Sleep -seconds 1

 }

checkproc.ps1の実行例

.\checkproc.ps1 cleanmgr 

 

■サンプルスクリプト:PowerShellからスケジュールされたタスクを実行する

以下は、指定したタスクが無効でなく、準備完了など実行中以外の状態であればすぐに実行を開始して、実行が終了するまで待つ汎用的なPowerShellスクリプトです。

runtask.ps1  (使用法:.\runtask.ps1 "<タスク名>“ "<タスクパス> ")

 param($taskname,$taskpath)
 $taskfullname = $taskpath+$taskname
 $taskstate = (get-scheduledtask -taskname $taskname -taskpath $taskpath -ErrorAction
 SilentlyContinue).State
 if ($taskstate -eq $null) {
 Write-Host "Error : $taskname is not exist."

 exit

 }
 if ($taskstate -eq "Disabled") {
 Write-Host "$taskname is $taskstate : nothing to do."
 } elseif ($taskstate -eq "Ready") {
  Write-Host -NoNewLine "Start $taskname immediately... "

 #Start-ScheduledTask -taskname $taskname -taskpath $taskpath
 SCHTASKS /Run /I /TN $taskfullname
 } elseif ($taskstate -eq "Running") {
 Write-Host -NoNewLine "$taskname is already running."
 } else {

 Write-Host -NoNewLine "Try to start $taskname... "

 SCHTASKS /Run /I /TN $taskfullname
 Write-Host -NoNewLine "$taskname is already in progress."
}

 

 while(1) {

 $taskstate = (get-scheduledtask -taskname $taskname -taskpath $taskpath -ErrorAction SilentlyContinue).State

 if ($taskstate -eq "Ready") {
 Write-Host "Task completed. (Ready)"
 break
 } elseif ($taskstate -eq "Disabled") {
Write-Host "Task completed. (Disabled)"

 break
 } else {
 Write-Host -NoNewLine "."
 }
 Start-Sleep -seconds 1

 }

NGENタスクの実行例

.¥runtask.ps1 ".NET Framework NGEN v4.0.30319 Critical" "¥Microsoft¥Windows¥.NET Framework¥" 

 .¥runtask.ps1 ".NET Framwork NGEN v4.0.30319 64 Critical" "¥Microsoft¥Windows¥.NET Framework¥" 

 

※本ページは2022年6月22日現在の情報です。

 

■ ホワイトペーパーをダウンロードする

 こちらのページの続きを含めた、全10テクニックをまとめたホワイトペーパーをご覧いただけます。以下のフォームよりお申込みください。

 

■ Windows Update の負荷を軽減させる方法

 山市氏がご紹介したテクニックをより簡単に自動化できる方法をご紹介します。

詳しくはこちらをご確認ください。
https://www2.say-tech.co.jp/special/ryo-yamaichi/say/tec-003

最新記事