Det vanliga sättet att köra en bot på en Windows-VPS är att starta den i en RDP-session och stänga fönstret. Det fungerar tills en uppdatering startar om servern klockan 3 på natten och ingen startar den igen. Schemaläggaren, som finns på alla Windows Server, löser det utan extra programvara. Uppsättningen nedan:
- startar skriptet vid uppstart, innan någon loggat in;
- startar om det inom en minut om det kraschar eller dödas;
- kör aldrig två kopior samtidigt.
Vi testade alla tre på vår Windows Server 2022-avbild: dödade processen, startade om servern och räknade instanserna.
Exempelskriptet
En ersättare för din bot: skriver en rad var tionde sekund, så det är lätt att 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
}
'@
Registrera aktiviteten
Kör i en PowerShell med administratörsrättigheter:
$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'
Vad varje del gör:
-AtStartupstartar boten när Windows startar, utan inloggad användare.- Upprepningen varje minut kör aktiviteten igen varje minut. Lever boten händer ingenting; har den dött startar den igen.
-MultipleInstances IgnoreNewgör upprepningen säker: en körning som hittar boten redan igång hoppas över.-ExecutionTimeLimit 0stänger av standardgränsen på 72 timmar, efter vilken Schemaläggaren skulle stoppa boten.-User 'SYSTEM'kör den utan lösenord och session. SYSTEM har fulla rättigheter på servern, så kör bara din egen kod på det här sättet.
För Python byter du åtgärden:
$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py' -WorkingDirectory 'C:\bots'
Vad vi kontrollerade
Krasch. Vi dödade botens process med Stop-Process -Force. 46 sekunder senare hade minututlösaren startat en ny, och det fanns exakt en kopia.
Omstart. Vi startade om servern och loggade inte in. 40 sekunder efter uppstart skrev boten redan i sin logg, utan användarsessioner på servern.
Vad som inte fungerade. Två saker ser rätt ut men är det inte:
- ”Om aktiviteten misslyckas, starta om var…” Vi slog på den, dödade processen, och aktiviteten låg i läget Redo i flera minuter. Den reagerar på en aktivitet som inte kan starta, inte på att ditt program dör senare.
- En omslagsloop (
while ($true) { & bot; sleep 5 }). Den startar om en kraschad bot, men dör själva omslaget fortsätter barnet att köra och nästa start drar igång en andra bot. Vi fick två kopior, vilket för en Telegram-bot betyder två processer som slåss om samma uppdateringar.
Håll koll
Get-ScheduledTask -TaskName mybot | Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName mybot | Select-Object LastRunTime, NextRunTime
Get-Content C:\bots\heartbeat.log -Tail 5
För att stoppa den vid underhåll kör du först Disable-ScheduledTask mybot (annars startar minututlösaren den igen) och stoppar sedan processen. Enable-ScheduledTask mybot tar tillbaka den.
Loggar
Aktiviteten fångar ingen utdata. Låt boten skriva sin egen logg, som exemplet gör, eller dirigera om utdata i en liten .cmd-startfil och peka -Execute på den filen.
Vilken plan
En bot i PowerShell eller Python använder lite CPU, men Windows självt tar 1 till 1,3 GB RAM i viloläge på vår avbild. Windows-Small (4 vCPU, 4 GB RAM, 50 GB, $11/mån) är rätt storlek för en eller två botar. På en NAT-plan fungerar utgående anslutningar (Telegram, börsers API:er, webhooks du anropar) som vanligt. Måste boten ta emot webhooks eller annan inkommande trafik, välj Windows Small-IP ($28/mån) med egen IPv4.
Nästa steg: skydda RDP och, om du hellre sköter boten via SSH, installera OpenSSH. Betalning sker i USDT, USDC eller ETH, och Windows är Server 2022 med din egen licens (BYOL). Alla planer: Windows VPS.
Kommentarer
Inga kommentarer än. Bli först.