−25%

på Windows vid årsbetalning, till 31/10. Till paketen

EQVPS
Kom igång

Så kör du ett skript dygnet runt på Windows Server: överlever utloggning, krascher och omstarter

Håll en bot eller ett skript igång dygnet runt på en Windows Server 2022-VPS med bara Schemaläggaren: start vid uppstart utan inloggad användare, omstart inom en minut efter en krasch och aldrig två kopior. Vi dödade processen och startade om för att kontrollera.

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:

  • -AtStartup startar 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 IgnoreNew gör upprepningen säker: en körning som hittar boten redan igång hoppas över.
  • -ExecutionTimeLimit 0 stä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:

  1. ”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.
  2. 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.

FAQ

Varför inte bara låta skriptet köra i min RDP-session?

Det fungerar tills något avslutar sessionen: utloggning, en omstart efter uppdateringar eller en krasch. Att stänga RDP-fönstret (koppla från) håller sessionen vid liv, men utloggning dödar allt i den, och efter en omstart är ingen inloggad som kan starta skriptet igen. En schemalagd aktivitet är inte beroende av någon session.

Har inte Schemaläggaren inställningen 'starta om vid fel'?

Jo, men i vårt test hjälpte den inte. När vi dödade skriptets process gick aktiviteten till 'Redo' och stannade där. Inställningen reagerar när aktiviteten inte kan starta, inte när ditt program dör senare. Det som tar tillbaka det är den upprepade utlösaren i den här guiden.

Kan två kopior av min bot köra samtidigt?

Inte med den här uppsättningen. Aktiviteten kör själva boten (inget omslagsskript) och använder MultipleInstances IgnoreNew, så minututlösaren gör ingenting medan boten lever. Det är just en omslagsloop som skapar dubbletter: döda omslaget, dess barnprocess fortsätter och ett nytt omslag startar en till. Det såg vi hända.

Fungerar det för Python eller Node.js?

Ja. Ange tolken i -Execute och skriptet i -Argument, med fullständiga sökvägar, till exempel -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py'. Installera tolken för alla användare så att SYSTEM-kontot hittar den.

Kommentarer

Inga kommentarer än. Bli först.

Lämna en kommentar

Kommentarer modereras innan de visas.