−25%

på Windows ved årlig betaling, til 31/10. Se pakkerne

EQVPS
Kom i gang

Sådan kører du et script døgnet rundt på Windows Server: overlever logud, nedbrud og genstarter

Hold en bot eller et script kørende døgnet rundt på en Windows Server 2022-VPS med kun Opgavestyring: start ved opstart uden nogen logget ind, genstart inden for et minut efter et nedbrud og aldrig to kopier. Vi dræbte processen og genstartede for at kontrollere det.

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:

  • -AtStartup starter 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 IgnoreNew gør gentagelsen sikker: en kørsel, der finder botten allerede kørende, springes over.
  • -ExecutionTimeLimit 0 slå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:

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

FAQ

Hvorfor ikke bare lade scriptet køre i min RDP-session?

Det virker, indtil noget afslutter sessionen: et logud, en genstart efter opdateringer eller et nedbrud. At lukke RDP-vinduet (afbryde) holder sessionen i live, men logud dræber alt i den, og efter en genstart er ingen logget ind til at starte scriptet igen. En planlagt opgave afhænger ikke af nogen session.

Har Opgavestyring ikke indstillingen 'genstart ved fejl'?

Jo, men den hjalp ikke i vores test. Da vi dræbte scriptets proces, gik opgaven til 'Klar' og blev der. Indstillingen reagerer, når opgaven ikke kan starte, ikke når dit program dør senere. Det, der bringer det tilbage, er den gentagne udløser i denne vejledning.

Kan to kopier af min bot ende med at køre?

Ikke med denne opsætning. Opgaven kører selve botten (intet indpakningsscript) og bruger MultipleInstances IgnoreNew, så minutudløseren gør intet, mens botten lever. Det er netop en indpakningsløkke, der skaber dubletter: dræb indpakningen, dens underproces kører videre, og en ny indpakning starter en til. Det så vi ske.

Virker det med Python eller Node.js?

Ja. Sæt fortolkeren i -Execute og scriptet i -Argument, med fulde stier, for eksempel -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py'. Installer fortolkeren for alle brugere, så SYSTEM-kontoen kan finde den.

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.