Триггеры — расписание и наблюдатели
Play ITЗагрузка интерактивного демо…
Практическая автоматизация — модель и окупаемость — модель → Стандартные блоки и модули PowerShell — блоки и модули → эта статья → практика в 2.05/112.
Два типа фоновых скриптов
| Тип | Как работает | Примеры задач |
|---|---|---|
| Запланированный (scheduled) | Стартует по календарю, завершается | Бэкап ночью, отчёт раз в неделю, очистка temp |
| Наблюдатель (watcher) | Работает постоянно или опрашивает часто | Новый файл в папке, порог диска, очередь сообщений |
Оба типа — триггеры из модели автоматизации. Код действий один и тот же; меняется только способ запуска.
Любой .ps1 должен отрабатывать вручную с -NoProfile -File и возвращать exit 0 / exit 1. Планировщик лишь повторяет то, что уже проверено человеком.
Три вопроса перед настройкой триггера
1. Зависимости
- Какие модули нужны (
Import-Moduleв начале скрипта)? - Установлены ли они для той УЗ, от которой пойдёт задача (системная vs пользовательская)?
- Нужны ли разные версии одного модуля для двух скриптов на одном хосте?
Install-Module внутри рабочего скрипта не используют — установка при подготовке сервера или образа.
2. Место выполнения
| Ошибка | Последствие |
|---|---|
| Скрипт Azure AD на машине без сети | Таймаут, ложный алерт |
| Создание пользователя AD на одном DC, почта Exchange на другом — без репликации | "Пользователь не найден" |
| Задача, требующая локального WMI/CIM, запущена удалённо | Пустой или неверный результат |
Скрипт запускают там, где есть данные и права, а не "где удобнее".
3. Контекст (учётная запись)
| Контекст | Когда |
|---|---|
| Пользователь (доменная УЗ в планировщике) | AD, SQL с SQL-auth, сетевые шары под пользователем |
| SYSTEM / LocalService | Локальные службы, реестр машины, до входа пользователя |
| УЗ службы (gMSA / dedicated) | Продакшен-автоматизация с минимальными правами |
Модули, установленные только в профиль пользователя, недоступны задаче, стартующей от SYSTEM — ставьте -Scope AllUsers или AllUsers для Windows.
Запланированный скрипт в Windows
Полный пример Register-ScheduledTask — в 2.05/112. Краткая схема:
$action = New-ScheduledTaskAction `
-Execute 'pwsh.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Archive-Logs.ps1"' `
-WorkingDirectory 'C:\Scripts'
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At '02:00'
Register-ScheduledTask -TaskName 'Archive-Logs' -Action $action -Trigger $trigger
| Параметр запуска | Зачем |
|---|---|
-NoProfile | Без личных алиасов и медленного профиля |
-ExecutionPolicy Bypass | Только для этой сессии; не меняет политику машины |
-WorkingDirectory | Относительные пути и логи рядом со скриптом |
-StartWhenAvailable | Догнать пропуск, если сервер был выключен |
Linux / macOS — cron или systemd timer с pwsh:
0 2 * * 0 /usr/bin/pwsh -NoProfile -File /opt/scripts/archive-logs.ps1 >> /var/log/archive-logs.log 2>&1
Подробнее про cron и systemd — скрипты Unix.
CI (Jenkins, GitHub Actions) — ещё один вид расписания: pipeline по cron или webhook; см. DevOps.
Скрипт-наблюдатель и исполнитель
Надёжный паттерн из практики автоматизации — разделение ролей:
Наблюдатель (лёгкий, долгоживущий)
→ обнаружил событие
→ запускает Исполнитель (тяжёлый .ps1 с param)
→ ждёт exit code / таймаут
Исполнитель (Process-Inbound.ps1) — обычный скрипт с param, try/catch, exit.
Наблюдатель — минимальная логика ожидания:
Код ITЗагрузка примера кода…
FileSystemWatcher (реакция без минутного опроса) — пример в 2.05/112.
Корректное завершение наблюдателя
- Обрабатывайте Ctrl+C и остановку службы: trap или
Register-EngineEvent -SourceIdentifier PowerShell.Exiting. - Не запускайте второй исполнитель, пока первый не завершился (флаг
$busyили очередь). - Логируйте каждый запуск исполнителя с меткой времени.
Сравнение способов запуска
| Способ | Платформа | Плюсы | Минусы |
|---|---|---|---|
| Планировщик Windows | Windows | Встроен, GUI, Register-ScheduledTask | Контекст УЗ, нет sub-minute cron |
| cron / systemd | Linux | Просто, привычно админам | Нужен установленный pwsh |
| FileSystemWatcher | Windows (.NET) | Быстрая реакция на файл | Долгоживущий процесс, отладка сложнее |
| Опрос в цикле | Любая | Простой код | Задержка, лишний CPU |
| Jenkins / GHA | Сервер CI | История, артефакты, секреты CI | Инфраструктура |
Чек-лист триггера
| # | Вопрос |
|---|---|
| 1 | Скрипт проходит ручной запуск с теми же аргументами, что у планировщика? |
| 2 | Модули установлены для УЗ задачи? |
| 3 | Пути абсолютные или $PSScriptRoot? |
| 4 | Есть журнал и exit 1 при ошибке? |
| 5 | Для watcher — что при двойном срабатывании и при падении исполнителя? |
| 6 | Секреты берутся из хранилища, а не из .ps1? — Рекомендации по написанию PowerShell-скриптов |
Дальше
| Тема | Материал |
|---|---|
| Remoting, массовый запуск | 2.05/112 |
| Секреты, SecretManagement | Секреты и безопасная автоматизация |
| Конфигурация JSON | Конфигурация и адаптивные скрипты |
| Тесты перед продакшеном | Рекомендации по написанию PowerShell-скриптов — Pester, Автоматизация задач в Windows с помощью PowerShell — Pester |