0

我正在寻找方法来确定 Azure VM 是否已经闲置了一个多小时。如果超过一个小时没有鼠标移动,则符合空闲条件的标准。我想保存 VM 的状态并将其关闭。

这可以使用 Powershell 命令来实现吗?

4

1 回答 1

0

我过去配置了类似的东西,不幸的是,这样做的唯一可靠方法是通过Windows上的任务计划(您没有在原始问题中指定操作系统)。现在,您应该在 PowerShell 中执行的以下代码将:

  1. 如果在过去 30 分钟内没有任何活动,它将在另外 60 秒内触发关闭命令,让用户有时间执行任何操作,以便取消它并等待下一个触发周期。注意开关RunOnlyIfIdle
  2. 在晚上 8 点开始检查接下来的 12 小时,每 1 小时检查一次机器上是否有任何活动(包括点击、鼠标移动等),它不包括系统进程,因为它是为执行此操作而构建的
  3. RunLevel设置为 1,因此操作系统有权执行任务,而不考虑用户是否仍然登录的事实
  4. 如您所见,最后两行实际上创建了计划任务,并且它被配置为在执行脚本的当前登录用户的上下文下创建它,但可以根据需要进行调整

现在这只会关闭操作系统,但 Azure 中的 VM 资源只会达到“已停止”状态,因此仍会向您收取计算能力费用。为了让它进入“已停止(解除分配) ”状态并停止向您收费,我在 Azure 中有一个自动化帐户,该帐户有一个脚本,计划每小时执行一次并扫描所有状态为“已停止”的虚拟机,然后它执行命令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)
于 2020-01-24T12:11:00.587 回答