Я настраивал нечто подобное в прошлом, и, к сожалению, единственный надежный способ сделать это, был через запланированное задание на Windows (вы не указываете ОС в исходном вопросе). Теперь следующий код, который вы должны выполнить в PowerShell, будет:
- Если в течение последних 30 минут не было никаких действий, он вызовет команду отключения еще через 60 секунд, чтобы дать пользователю время для выполнения любого действия в Чтобы отменить его и дождаться следующего периода запуска. Обратите внимание на переключатель RunOnlyIfIdle
- Начните проверять в 8 вечера в течение следующих 12 часов каждые 1 час, были ли какие-либо действия на машине (включая щелчки, движения мыши и т. Д. c.), он исключает системные процессы при сборке, чтобы сделать именно это
- RunLevel установлен в 1, поэтому ОС имеет разрешения на выполнение задачи без учета того, является ли пользователь все еще вошел в систему или нет
- Как вы можете видеть, две последние строки фактически создают запланированное задание, и оно настроено на его создание в контексте текущего вошедшего в систему пользователя, который выполнил сценарий, но может быть отрегулирован при необходимости
Теперь это только приведет к выключению ОС, но ресурс виртуальной машины в Azure достигнет только состояния " Stopped ", тем самым по-прежнему взимая с вас деньги за вычислительную мощность. Чтобы перевести его в состояние « Stopped (Deallocated) » и прекратить взимать с вас плату, у меня была учетная запись автоматизации в Azure, в которой был запланирован сценарий, который должен был выполняться каждый час, и сканировать все виртуальные машины с состоянием «Остановился», а затем выполнил команду Az-StopVM , которая фактически освободила виртуальную машину и прекратила взимать деньги.
$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)