【发布时间】:2016-05-09 16:24:20
【问题描述】:
我有一个 Powershell 脚本,它可以停止 IIS 网站和相应的应用程序池,然后删除应用程序日志(log4net 日志)。这是脚本sn-p:
stop-website -name "MyWebsite"
stop-webapppool -name "MyWebsite"
del c:\inetpub\MyWebsite\logs\*.*
问题是 stop-website 和 stop-webapppool 似乎在网站完全关闭之前返回,这导致删除失败,说明文件正在被另一个进程使用:
del:无法删除项目 C:\inetpub\MyWebsite\logs\App.log:该进程无法访问文件“C:\inetpub\MyWebsite\logs\App.log”,因为它正被另一个进程使用。
如果我在停止命令和 del 命令之间添加 10 秒睡眠,则日志将成功删除。虽然这是非常骇人听闻的,但并不可靠。有没有办法强制 stop-website/stop-webapppool 命令在网站/应用程序池完全停止之前不返回?
谢谢。
从以下链接实施的解决方案。如果 IIS 进程没有停止,我将等待大约 60 秒,然后终止它。
https://greenfinch.ie/blog/powershellscript.html
"Stopping IIS site [$name]" >> $logFile
stop-website -name $name
"Stopping app pool [$name]" >> $logFile
stop-webapppool -name $name
$sleepTime = 5
$processId = $TRUE
while ($processId)
{
$processId = Get-WmiObject -Class win32_process -filter "name='w3wp.exe'" |
?{ ($_.CommandLine).Split("`"")[1] -eq $name } |
%{ $_.ProcessId }
if ($sleepTime -gt 60)
{
"Waited [$sleepTime] sec for process [$processId] to stop and it is still running. Killing it." >> $logFile
Stop-Process $processId
break
}
if ($processId)
{
"App pool [$name] is running with process ID: [$processId]. Sleeping for [$sleepTime] sec and then checking again." >> $logFile
Start-Sleep -s $sleepTime
$sleepTime = $sleepTime + 10
}
}
【问题讨论】:
标签: powershell iis