如何保持每30分钟检查一次进程?
How to keep checking the process after every 30 minutes?
如果开始时间是 less than 2 hours.
,我需要 kill the process
如果开始时间是 more than 2 hours.
,我需要 add sleep for 30 mins
我需要 keep repeating
它直到进程不再 运行.
到目前为止,我已经编写了以下脚本来执行上述操作。
$procName = 'myprocess'
$process = Get-Process | Where-Object Name -EQ $procName
if(-not $process) {
Write-Warning "$procName not found!"
}
else {
$process | ForEach-Object {
if($_.StartTime -lt [datetime]::Now.AddHours(-2)) {
Stop-Process $_ -Force
}
else {
sleep(1800)
}
}
}
}
如何在do-while
或另一个循环中加入上述程序,以便一直检查直到进程不再运行?
另外,如何实现最长 4 小时的计时器?
我建议您使用 windows 计划任务,每 30 分钟左右启动一次 powershell 脚本,而不是使用正在等待的 powershell 阻塞资源。
您可以启动 powershell 并传递脚本。
PowerShell.exe - 文件“C:\script.ps1”
如果我没理解错的话,你的 else
条件可能看起来像这样使用 do-while
循环:
else {
do {
"$procName is still running, sleeping for 1800 sec"
Start-Sleep -Seconds 1800
} while(Get-Process | Where-Object Name -EQ $procName)
}
但是请注意,如果进程永不停止或您实施了最大计时器等,这可能会导致无限循环。
根据您关于实现最大计时器的评论,您可以通过多种方式实现,我个人的偏好是使用 StopWatch
:
else {
$timer = [System.Diagnostics.Stopwatch]::StartNew()
do {
# Do this while the process is still running AND
# the timer hasn't yet reached 4 hours
"$procName is still running, sleeping for 1800 sec"
Start-Sleep -Seconds 1800
$stillRunning = Get-Process | Where-Object Name -EQ $procName
} while($stillRunning -and $timer.Elapsed.Hours -lt 4)
$timer.Stop()
}
如果开始时间是 less than 2 hours.
,我需要 kill the process
如果开始时间是 more than 2 hours.
,我需要 add sleep for 30 mins
我需要 keep repeating
它直到进程不再 运行.
到目前为止,我已经编写了以下脚本来执行上述操作。
$procName = 'myprocess'
$process = Get-Process | Where-Object Name -EQ $procName
if(-not $process) {
Write-Warning "$procName not found!"
}
else {
$process | ForEach-Object {
if($_.StartTime -lt [datetime]::Now.AddHours(-2)) {
Stop-Process $_ -Force
}
else {
sleep(1800)
}
}
}
}
如何在do-while
或另一个循环中加入上述程序,以便一直检查直到进程不再运行?
另外,如何实现最长 4 小时的计时器?
我建议您使用 windows 计划任务,每 30 分钟左右启动一次 powershell 脚本,而不是使用正在等待的 powershell 阻塞资源。
您可以启动 powershell 并传递脚本。 PowerShell.exe - 文件“C:\script.ps1”
如果我没理解错的话,你的 else
条件可能看起来像这样使用 do-while
循环:
else {
do {
"$procName is still running, sleeping for 1800 sec"
Start-Sleep -Seconds 1800
} while(Get-Process | Where-Object Name -EQ $procName)
}
但是请注意,如果进程永不停止或您实施了最大计时器等,这可能会导致无限循环。
根据您关于实现最大计时器的评论,您可以通过多种方式实现,我个人的偏好是使用 StopWatch
:
else {
$timer = [System.Diagnostics.Stopwatch]::StartNew()
do {
# Do this while the process is still running AND
# the timer hasn't yet reached 4 hours
"$procName is still running, sleeping for 1800 sec"
Start-Sleep -Seconds 1800
$stillRunning = Get-Process | Where-Object Name -EQ $procName
} while($stillRunning -and $timer.Elapsed.Hours -lt 4)
$timer.Stop()
}