查找 Azure VM 是否一直处于空闲状态
Find if Azure VM has been idle
我正在寻找方法来确定 Azure VM 是否闲置了一个多小时。
如果超过一个小时没有鼠标移动,则符合闲置条件的标准。
我想保存虚拟机的状态并关闭它。
这可以使用 Powershell 命令实现吗?
我过去配置过类似的东西,不幸的是,唯一可靠的方法是通过计划在 Windows 上的任务(你没有在您的原始问题中指定 OS)。现在,您应该在 PowerShell 中执行以下代码:
- 如果在过去的 30 分钟内没有 activity,它会触发一个关闭命令,并有 60 秒的时间让用户有时间执行任何操作以取消它并等待下一个触发周期。注意开关 RunOnlyIfIdle
- 在接下来的 12 小时晚上 8 点开始每 1 小时检查机器上是否有任何 activity(包括点击、鼠标移动等),它不包括系统进程,因为它被构建为完全做到这一点
- RunLevel 设置为 1,因此 OS 有权执行任务,而不管用户是否仍处于登录状态
- 如您所见,最后两行实际上创建了计划任务,并且配置为在执行脚本的当前登录用户的上下文中创建它,但可以根据需要进行调整
现在这只会关闭 OS,但 Azure 中的 VM 资源只会达到“Stopped”状态,因此仍会向您收取计算费用力量。为了让它进入“Stopped (Deallocated)”状态并停止向您收费,我在 Azure 中有一个自动化帐户,它有一个计划每小时执行一次并扫描所有 VM 的脚本状态为 "Stopped",然后它执行了命令 Az-StopVM,该命令实际上释放了 VM 并停止收费。
$TaskName = 'Idle_Shutdown'
$Service = New-Object -ComObject('Schedule.Service')
$Service.Connect()
$RootFolder = $Service.GetFolder('')
$TaskDefinition = $Service.NewTask(0)
$Settings = $TaskDefinition.Settings
$Settings.AllowDemandStart = $true
$Settings.Compatibility = 2
$Settings.Enabled = $true
$Settings.RunOnlyIfIdle = $true
$Settings.IdleSettings.IdleDuration = 'PT30M'
$Settings.IdleSettings.WaitTimeout = 'PT5M'
$Settings.IdleSettings.StopOnIdleEnd = $true
$Trigger = $TaskDefinition.Triggers.Create(2)
$Trigger.Repetition.Interval = 'PT1H'
$Trigger.Repetition.Duration = 'PT12H'
$Trigger.StartBoundary = ([datetime]::Now).ToString("yyyy-MM-dd'T'20:00:00")
$Trigger.Enabled = $true
$Action = $TaskDefinition.Actions.Create(0)
$Action.Path = 'shutdown'
$Action.Arguments = '/s /t 60'
$LocalUser = $TaskDefinition.Principal
$LocalUser.RunLevel = '1'
$user = [environment]::UserDomainName + '\' + [environment]::UserName
$null = $RootFolder.RegisterTaskDefinition($TaskName, $TaskDefinition, 6, $user, $null, 2)
我正在寻找方法来确定 Azure VM 是否闲置了一个多小时。 如果超过一个小时没有鼠标移动,则符合闲置条件的标准。 我想保存虚拟机的状态并关闭它。
这可以使用 Powershell 命令实现吗?
我过去配置过类似的东西,不幸的是,唯一可靠的方法是通过计划在 Windows 上的任务(你没有在您的原始问题中指定 OS)。现在,您应该在 PowerShell 中执行以下代码:
- 如果在过去的 30 分钟内没有 activity,它会触发一个关闭命令,并有 60 秒的时间让用户有时间执行任何操作以取消它并等待下一个触发周期。注意开关 RunOnlyIfIdle
- 在接下来的 12 小时晚上 8 点开始每 1 小时检查机器上是否有任何 activity(包括点击、鼠标移动等),它不包括系统进程,因为它被构建为完全做到这一点
- RunLevel 设置为 1,因此 OS 有权执行任务,而不管用户是否仍处于登录状态
- 如您所见,最后两行实际上创建了计划任务,并且配置为在执行脚本的当前登录用户的上下文中创建它,但可以根据需要进行调整
现在这只会关闭 OS,但 Azure 中的 VM 资源只会达到“Stopped”状态,因此仍会向您收取计算费用力量。为了让它进入“Stopped (Deallocated)”状态并停止向您收费,我在 Azure 中有一个自动化帐户,它有一个计划每小时执行一次并扫描所有 VM 的脚本状态为 "Stopped",然后它执行了命令 Az-StopVM,该命令实际上释放了 VM 并停止收费。
$TaskName = 'Idle_Shutdown'
$Service = New-Object -ComObject('Schedule.Service')
$Service.Connect()
$RootFolder = $Service.GetFolder('')
$TaskDefinition = $Service.NewTask(0)
$Settings = $TaskDefinition.Settings
$Settings.AllowDemandStart = $true
$Settings.Compatibility = 2
$Settings.Enabled = $true
$Settings.RunOnlyIfIdle = $true
$Settings.IdleSettings.IdleDuration = 'PT30M'
$Settings.IdleSettings.WaitTimeout = 'PT5M'
$Settings.IdleSettings.StopOnIdleEnd = $true
$Trigger = $TaskDefinition.Triggers.Create(2)
$Trigger.Repetition.Interval = 'PT1H'
$Trigger.Repetition.Duration = 'PT12H'
$Trigger.StartBoundary = ([datetime]::Now).ToString("yyyy-MM-dd'T'20:00:00")
$Trigger.Enabled = $true
$Action = $TaskDefinition.Actions.Create(0)
$Action.Path = 'shutdown'
$Action.Arguments = '/s /t 60'
$LocalUser = $TaskDefinition.Principal
$LocalUser.RunLevel = '1'
$user = [environment]::UserDomainName + '\' + [environment]::UserName
$null = $RootFolder.RegisterTaskDefinition($TaskName, $TaskDefinition, 6, $user, $null, 2)