Den sædvanlige måde at køre en bot på en Windows-VPS er at starte den i en RDP-session og lukke vinduet. Det virker, indtil en opdatering genstarter serveren kl. 3 om natten, og ingen starter den igen. Opgavestyring, som findes på alle Windows Server, løser det uden ekstra software. Opsætningen nedenfor:
- starter scriptet ved opstart, før nogen logger ind;
- genstarter det inden for et minut, hvis det går ned eller bliver dræbt;
- kører aldrig to kopier på samme tid.
Vi testede alle tre på vores Windows Server 2022-image: dræbte processen, genstartede serveren og talte instanserne.
Eksempelscriptet
En stand-in for din bot: skriver en linje hvert 10. sekund, så det er let at se, om den lever.
New-Item -ItemType Directory -Force C:\bots | Out-Null
Set-Content C:\bots\heartbeat.ps1 -Encoding ascii -Value @'
while ($true) {
Add-Content -Path C:\bots\heartbeat.log -Value ("{0:u} pid {1}" -f (Get-Date), $PID)
Start-Sleep -Seconds 10
}
'@
Registrer opgaven
Kør i en PowerShell med administratorrettigheder:
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -ExecutionPolicy Bypass -File C:\bots\heartbeat.ps1' -WorkingDirectory 'C:\bots'
$atBoot = New-ScheduledTaskTrigger -AtStartup
$everyMin = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 1)
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit ([TimeSpan]::Zero) -MultipleInstances IgnoreNew -StartWhenAvailable
Register-ScheduledTask -TaskName 'mybot' -Action $action -Trigger $atBoot, $everyMin -Settings $settings -User 'SYSTEM' -RunLevel Highest
Start-ScheduledTask -TaskName 'mybot'
Hvad hver del gør:
-AtStartupstarter botten, når Windows starter, uden en bruger logget ind.- Gentagelsen hvert minut kører opgaven igen hvert minut. Lever botten, sker der intet; er den død, starter den igen.
-MultipleInstances IgnoreNewgør gentagelsen sikker: en kørsel, der finder botten allerede kørende, springes over.-ExecutionTimeLimit 0slår standardgrænsen på 72 timer fra, hvorefter Opgavestyring ville stoppe botten.-User 'SYSTEM'kører den uden adgangskode og uden session. SYSTEM har fulde rettigheder på serveren, så kør kun din egen kode på denne måde.
Til Python udskifter du handlingen:
$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py' -WorkingDirectory 'C:\bots'
Hvad vi kontrollerede
Nedbrud. Vi dræbte bottens proces med Stop-Process -Force. 46 sekunder senere havde minutudløseren startet en ny, og der var præcis én kopi.
Genstart. Vi genstartede serveren og loggede ikke ind. 40 sekunder efter opstart skrev botten allerede i sin log, uden brugersessioner på serveren.
Hvad der ikke virkede. To ting ser rigtige ud, men er det ikke:
- „Hvis opgaven mislykkes, genstart hvert…” Vi slog den til, dræbte processen, og opgaven stod i flere minutter i tilstanden Klar. Den reagerer på en opgave, der ikke kan starte, ikke på at dit program dør senere.
- En indpakningsløkke (
while ($true) { & bot; sleep 5 }). Den genstarter en bot, der er gået ned, men dør selve indpakningen, kører barnet videre, og næste start starter en bot nummer to. Vi endte med to kopier, hvilket for en Telegram-bot betyder to processer, der slås om de samme opdateringer.
Hold øje med den
Get-ScheduledTask -TaskName mybot | Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName mybot | Select-Object LastRunTime, NextRunTime
Get-Content C:\bots\heartbeat.log -Tail 5
For at stoppe den til vedligeholdelse kører du først Disable-ScheduledTask mybot (ellers starter minutudløseren den igen) og stopper derefter processen. Enable-ScheduledTask mybot bringer den tilbage.
Logs
Opgaven opsamler ikke output. Lad botten skrive sin egen log, som eksemplet gør, eller omdiriger output i en lille .cmd-starter, og peg -Execute på den fil.
Hvilken plan
En bot i PowerShell eller Python bruger lidt CPU, men Windows selv fylder 1 til 1,3 GB RAM i tomgang på vores image. Windows-Small (4 vCPU, 4 GB RAM, 50 GB, $11/md.) er den rette størrelse til en eller to bots. På en NAT-plan virker udgående forbindelser (Telegram, børs-API'er, webhooks du kalder) som normalt. Skal botten modtage webhooks eller anden indgående trafik, så vælg Windows Small-IP ($28/md.) med egen IPv4.
Næste skridt: sikr RDP, og hvis du hellere vil styre botten via SSH, installer OpenSSH. Betaling sker i USDT, USDC eller ETH, og Windows er Server 2022 med din egen licens (BYOL). Alle planer: Windows VPS.
Kommentarer
Ingen kommentarer endnu. Vær den første.