Task Scheduler (Lập lịch tác vụ) là công cụ có sẵn trong Windows, tương đương Crontab trên Linux. Dùng để tự động chạy script, backup, restart service theo lịch.
Mở Task Scheduler:
taskschd.msc
Hoặc: Win + R → gõ taskschd.msc → Enter
==== TẠO TASK QUA GIAO DIỆN ====
Bước 1: Tạo Basic Task
1. Bên phải → Create Basic Task
2. Đặt tên và mô tả → Next
3. Chọn trigger (khi nào chạy): Daily / Weekly / Monthly / One time / When computer starts / When I log on
4. Chọn Action: Start a program
5. Browse chọn file .exe hoặc .bat hoặc .ps1 cần chạy
6. Finish
Bước 2: Tạo Advanced Task
Dùng Create Task (không phải Basic Task) để có thêm tùy chọn:
- Tab General: Tích "Run whether user is logged on or not" + "Run with highest privileges"
- Tab Triggers: Thêm nhiều trigger, lặp mỗi X phút
- Tab Actions: Chạy program/script
- Tab Conditions: Chỉ chạy khi có nguồn điện, có mạng...
- Tab Settings: Timeout, restart nếu fail
==== TẠO TASK BẰNG POWERSHELL ====
Chạy script mỗi ngày lúc 2 giờ sáng:
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\scripts\backup.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
$settings = New-ScheduledTaskSettingsSet -RunOnlyIfNetworkAvailable -WakeToRun
Register-ScheduledTask -TaskName "DailyBackup" -Action $action -Trigger $trigger -Settings $settings -RunLevel Highest -Force
Write-Host "Task created!"
Chạy script mỗi 30 phút:
$action = New-ScheduledTaskAction -Execute "python.exe" -Argument "C:\scripts\monitor.py"
$trigger = New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 30) -Once -At (Get-Date)
Register-ScheduledTask -TaskName "Monitor30Min" -Action $action -Trigger $trigger -RunLevel Highest -Force
Chạy khi Windows khởi động:
$action = New-ScheduledTaskAction -Execute "node.exe" -Argument "C:\myapp\index.js" -WorkingDirectory "C:\myapp"
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "StartNodeApp" -Action $action -Trigger $trigger -RunLevel Highest -User "SYSTEM" -Force
Chạy script .bat tự động backup:
Tạo file C:\scripts\backup.bat:
@echo off
set DATE=%date:~10,4%%date:~4,2%%date:~7,2%
xcopy "C:\inetpub\wwwroot" "D:\backup\web_%DATE%\" /E /I /Y
echo Backup done at %DATE% >> C:\scripts\backup.log
Đăng ký task:
$action = New-ScheduledTaskAction -Execute "C:\scripts\backup.bat"
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00"
Register-ScheduledTask -TaskName "WebBackup" -Action $action -Trigger $trigger -RunLevel Highest -Force
Các lệnh quản lý Task Scheduler:
# Xem tất cả task
Get-ScheduledTask | Select-Object TaskName, State | Format-Table
# Chạy task ngay
Start-ScheduledTask -TaskName "DailyBackup"
# Dừng task đang chạy
Stop-ScheduledTask -TaskName "DailyBackup"
# Xóa task
Unregister-ScheduledTask -TaskName "DailyBackup" -Confirm:$false
# Bật/tắt task
Enable-ScheduledTask -TaskName "DailyBackup"
Disable-ScheduledTask -TaskName "DailyBackup"
# Xem lịch sử chạy
Get-ScheduledTaskInfo -TaskName "DailyBackup"
Dùng schtasks.exe (CMD truyền thống):
# Tạo task chạy hàng ngày
schtasks /create /tn "MyTask" /tr "C:\scripts\run.bat" /sc daily /st 02:00 /ru SYSTEM /f
# Xem task
schtasks /query /tn "MyTask" /fo LIST
# Chạy ngay
schtasks /run /tn "MyTask"
# Xóa task
schtasks /delete /tn "MyTask" /f
Ví dụ thực tế hay dùng:
- Backup database MySQL mỗi đêm
- Restart IIS mỗi tuần (tránh memory leak)
- Chạy script dọn log cũ mỗi tháng
- Kiểm tra và tự restart service nếu bị down
- Chạy Windows Update vào giờ thấp điểm
Script tự động restart service nếu bị down:
# watchdog.ps1
$services = @("W3SVC", "MySQL57", "MSSQLSERVER")
foreach ($svc in $services) {
$status = (Get-Service -Name $svc -ErrorAction SilentlyContinue).Status
if ($status -ne "Running") {
Start-Service -Name $svc
Write-EventLog -LogName Application -Source "Watchdog" -EventId 1001 -Message "$svc was down, restarted at $(Get-Date)"
}
}
Đăng ký chạy mỗi 5 phút:
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\scripts\watchdog.ps1"
$trigger = New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 5) -Once -At (Get-Date)
Register-ScheduledTask -TaskName "ServiceWatchdog" -Action $action -Trigger $trigger -RunLevel Highest -User "SYST