我有一个Powershell脚本,可以停止IIS网站和相应的应用程序池,然后删除应用程序日志(log4net日志).这是脚本片段:
stop-website -name "MyWebsite"
stop-webapppool -name "MyWebsite"
del c:\inetpub\MyWebsite\logs\*.*
Run Code Online (Sandbox Code Playgroud)
问题是stop-website和stop-webapppool似乎在网站完全关闭之前返回,导致删除失败,说该文件正由另一个进程使用:
del:无法删除项目C:\ inetpub\MyWebsite\logs\App.log:进程无法访问文件'C:\ inetpub\MyWebsite\logs\App.log',因为它正由另一个进程使用.
如果我在stop命令和del命令之间添加10秒睡眠,则会成功删除日志.这是非常hackish但不可靠.有没有办法强制stop-website/stop-webapppool命令在网站/ apppool完全停止之前不返回?
谢谢.
从以下链接实施解决方案.我将等待~60秒然后如果它没有停止则终止IIS进程.
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
}
}
Run Code Online (Sandbox Code Playgroud)
Kai*_*hao 15
您可以使用这两个命令检查网站/应用程序的状态,比如10秒后,然后使用If语句仅在返回状态时删除日志 stopped
Get-WebsiteState -name "MyWebsite"
Get-WebAppPoolState -name "MyWebsite"
Run Code Online (Sandbox Code Playgroud)
这个循环也应该对你有帮助
$currentRetry = 0;
$success = $false;
do{
$status = Get-WebAppPoolState -name "MyWebsite"
if ($status -eq "Stopped"){
<....your code here....>
$success = $true;
}
Start-Sleep -s 10
$currentRetry = $currentRetry + 1;
}
while (!$success -and $currentRetry -le 4)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5676 次 |
最近记录: |