49

是否可以检查我上次回收应用程序池的时间,我想检查我的应用程序池上次回收的日期,IIS 中是否有任何东西我可以获得此信息。

4

6 回答 6

60

您可以使用此 powershell 代码段轻松找到最新的回收时间:

(Get-Process -Id <ProcessId>).StartTime

因此,在任务管理器中找到您的 Web 应用程序的进程 ID。首先通过Tools > Select columns...
添加以下列:选择PIDCommand Line。 查找任何 w3wp.exe 进程并通过检查命令行找到您的应用程序(应用程序池名称是其中的一部分)并记下其 PID。 然后运行powershell脚本查找最新的回收时间:

希望这可以帮助

于 2012-11-29T10:26:24.747 回答
26

如果登录回收已打开,您可以在事件查看器(系统日志)中看到这一点。

如果不是,您可以使用 PerfMon 计数器查看 W3WP.exe 上的 Process-Elapsed Time 代表您的应用程序池(这将是自上次回收以来的秒数)

于 2012-06-15T18:00:17.447 回答
12

要使用一个命令获取所有信息,请使用 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)}}
于 2017-10-27T12:21:26.073 回答
4

在 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
于 2018-10-18T02:10:13.907 回答
2

这将为您提供机器上所有 w3wp 进程及其启动时间的列表。如果没有启动任何网站并因此不存在 w3wp 进程,ErrorAction 可防止命令行开关引发错误

ps w3wp -ErrorAction SilentlyContinue | select ProcessName, StartTime

使用 powershell v4.0 在 Server 2012 R2 上测试

于 2017-10-18T14:02:04.110 回答
0

获取工作进程正常运行时间(推荐):

$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
    }
}
于 2017-11-22T17:19:49.313 回答