是否可以检查我上次回收应用程序池的时间,我想检查我的应用程序池上次回收的日期,IIS 中是否有任何东西我可以获得此信息。
6 回答
您可以使用此 powershell 代码段轻松找到最新的回收时间:
(Get-Process -Id <ProcessId>).StartTime
因此,在任务管理器中找到您的 Web 应用程序的进程 ID。首先通过Tools > Select columns...
添加以下列:选择PID和Command Line。
查找任何 w3wp.exe 进程并通过检查命令行找到您的应用程序(应用程序池名称是其中的一部分)并记下其 PID。
然后运行powershell脚本查找最新的回收时间:
希望这可以帮助
如果登录回收已打开,您可以在事件查看器(系统日志)中看到这一点。
如果不是,您可以使用 PerfMon 计数器查看 W3WP.exe 上的 Process-Elapsed Time 代表您的应用程序池(这将是自上次回收以来的秒数)
要使用一个命令获取所有信息,请使用 Get-WmiObject 而不是 get-process。
Get-WmiObject Win32_Process -Filter "name = 'w3wp.exe'" | Select-Object Name, @{"name"="ApplicationPool";expression={(($_).CommandLine).split('"')[1] }},@{"name"="Starttime";expression={$_.ConvertToDateTime($_.CreationDate)}}
在 Powershell 中:
(ps -id (Get-IISAppPool -Name <name>).WorkerProcesses.ProcessId).StartTime
如果池已经被回收,那么由于某种原因您可能需要重新导入模块以获取新的 processId:
$pool = Get-IISAppPool -Name <name>
$pool.recycle()
Import-Module -Force IISAdministration
(ps -id (Get-IISAppPool -Name <name>).WorkerProcesses.ProcessId).StartTime
这将为您提供机器上所有 w3wp 进程及其启动时间的列表。如果没有启动任何网站并因此不存在 w3wp 进程,ErrorAction 可防止命令行开关引发错误
ps w3wp -ErrorAction SilentlyContinue | select ProcessName, StartTime
使用 powershell v4.0 在 Server 2012 R2 上测试
获取工作进程正常运行时间(推荐):
$poolName = <your pool name goes here eg. DefaultPool>
$poolProcess =(gwmi -NS 'root\WebAdministration' -class 'WorkerProcess' | select AppPoolName,ProcessId | Where-Object { $_.AppPoolName -eq $poolName } )
$lastStartTime=(Get-Process -Id $poolProcess.ProcessId).StartTime
write-output $lastStartTime
要使其正常工作,请确保您启用了“IIS 管理脚本和工具”。
其次,方法是使用事件日志,如果启用
Get-Eventlog -LogName system -Newest 1 -Source "WAS" -Message "*recycle of all worker processes in application pool '$poolName'*")
Get-Eventlog
您可以使用参数-After/-Before
来进一步限制结果。
要检查应用程序池是否在最后“X”分钟内被回收,可以使用以下 powershell 片段:
function isRecycledInLastNMinutes($appPoolName, $lminutes){
$beforeDate = Get-Date -format 'u'
$afterDate = $beforeDate.addMinutes(-$lminutes)
$result = (Get-Eventlog -LogName system -Newest 1 -Source "WAS" -After $afterDate -Before $beforeDate -Message "*recycle of all worker processes in application pool '$appPoolName'*")
if( $result.length -eq 1){
return $true
}else{
retrun $false
}
}