−25%

Windows-ის წლიურ გადახდაზე, 31 ოქტომბრამდე. ტარიფებზე

EQVPS
დაწყება

როგორ ვამუშაოთ სკრიპტი 24/7 Windows Server-ზე: უძლებს გასვლას, ავარიებსა და გადატვირთვებს

ბოტი ან სკრიპტი დღე და ღამე Windows Server 2022 VPS-ზე მხოლოდ Task Scheduler-ით: იწყება ჩატვირთვისას შესული მომხმარებლის გარეშე, ავარიიდან ერთ წუთში ბრუნდება და ორ ასლად არასდროს მუშაობს. შესამოწმებლად პროცესი ძალით გავთიშეთ და სერვერი გადავტვირთეთ.

Windows VPS-ზე ბოტის გაშვების ჩვეულებრივი გზაა მისი დაწყება RDP სესიაში და ფანჯრის დახურვა. ეს მუშაობს, სანამ განახლება სერვერს ღამის 3 საათზე არ გადატვირთავს და ბოტს თავიდან არავინ გაუშვებს. Task Scheduler, რომელიც ყველა Windows Server-ზეა, ამას დამატებითი პროგრამის გარეშე წყვეტს. ქვემოთ მოცემული კონფიგურაცია:

  • სკრიპტს ჩატვირთვისას უშვებს, სანამ ვინმე შევა;
  • თავიდან უშვებს ერთ წუთში, თუ ავარიულად გაითიშა ან შეწყვიტეს;
  • არასდროს უშვებს ორ ასლს ერთდროულად.

სამივე ჩვენს Windows Server 2022 იმიჯზე შევამოწმეთ: პროცესი შევწყვიტეთ, სერვერი გადავტვირთეთ და ეგზემპლარები დავთვალეთ.

სკრიპტის მაგალითი

თქვენი ბოტის შემცვლელი: ყოველ 10 წამში სტრიქონს წერს, ამიტომ ადვილი სანახავია, ცოცხალია თუ არა.

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
}
'@

დაარეგისტრირეთ ამოცანა

გაუშვით ადმინისტრატორის უფლებების მქონე PowerShell-ში:

$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'

რას აკეთებს თითოეული ნაწილი:

  • -AtStartup ბოტს Windows-ის ჩატვირთვისას უშვებს, შესული მომხმარებლის გარეშე.
  • ყოველწუთიანი გამეორება ამოცანას ყოველ წუთს თავიდან უშვებს. თუ ბოტი ცოცხალია, არაფერი ხდება; თუ მოკვდა, ხელახლა იწყება.
  • -MultipleInstances IgnoreNew გამეორებას უსაფრთხოს ხდის: გაშვება, რომელიც ბოტს უკვე მომუშავეს პოულობს, გამოიტოვება.
  • -ExecutionTimeLimit 0 თიშავს 72-საათიან ნაგულისხმევ ლიმიტს, რის შემდეგაც Task Scheduler ბოტს გააჩერებდა.
  • -User 'SYSTEM' მას პაროლისა და სესიის გარეშე უშვებს. SYSTEM-ს სერვერზე სრული უფლებები აქვს, ამიტომ ასე მხოლოდ საკუთარი კოდი გაუშვით.

Python-ისთვის მოქმედება შეცვალეთ:

$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py' -WorkingDirectory 'C:\bots'

რა შევამოწმეთ

ავარია. ბოტის პროცესი Stop-Process -Force-ით შევწყვიტეთ. 46 წამის შემდეგ ყოველწუთიანმა ტრიგერმა ახალი გაუშვა და ზუსტად ერთი ასლი იყო.

გადატვირთვა. სერვერი გადავტვირთეთ და არ შევსულვართ. ჩატვირთვიდან 40 წამში ბოტი უკვე წერდა თავის ჟურნალში, სერვერზე მომხმარებლის სესიების გარეშე.

რამ არ იმუშავა. ორი რამ სწორად გამოიყურება, მაგრამ ასე არ არის:

  1. „თუ ამოცანა ჩავარდა, თავიდან გაუშვი ყოველ…“ ჩავრთეთ, პროცესი შევწყვიტეთ და ამოცანა წუთობით იდგა Ready მდგომარეობაში. ის რეაგირებს ამოცანაზე, რომელიც ვერ იწყება, და არა პროგრამაზე, რომელიც მოგვიანებით კვდება.
  2. შემფუთავი ციკლი (while ($true) { & bot; sleep 5 }). ის ავარიულად გათიშულ ბოტს თავიდან უშვებს, მაგრამ თუ თავად შემფუთავი მოკვდება, შვილობილი გააგრძელებს მუშაობას და შემდეგი გაშვება მეორე ბოტს დაიწყებს. საბოლოოდ ორი ასლი გვქონდა, რაც Telegram ბოტისთვის ნიშნავს ორ პროცესს, რომლებიც ერთსა და იმავე განახლებებზე ეჯიბრებიან.

როგორ შევამოწმოთ

Get-ScheduledTask -TaskName mybot | Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName mybot | Select-Object LastRunTime, NextRunTime
Get-Content C:\bots\heartbeat.log -Tail 5

მომსახურებისთვის გასაჩერებლად ჯერ გაუშვით Disable-ScheduledTask mybot (თორემ ყოველწუთიანი ტრიგერი თავიდან ჩართავს), შემდეგ პროცესი გააჩერეთ. Enable-ScheduledTask mybot ყველაფერს აბრუნებს.

ჟურნალები

ამოცანა გამოტანას არ იჭერს. ბოტმა თავისი ჟურნალი თავად წეროს, როგორც მაგალითში, ან გამოტანა პატარა .cmd ფაილში გადაამისამართეთ და -Execute მასზე მიუთითეთ.

რომელი გეგმა

PowerShell-ის ან Python-ის ბოტი ცოტა CPU-ს იყენებს, მაგრამ თავად Windows ჩვენს იმიჯზე უმოქმედობისას 1-დან 1,3 GB-მდე RAM-ს იკავებს. Windows-Small (4 vCPU, 4 GB RAM, 50 GB, $11/თვე) ერთი-ორი ბოტისთვის შესაფერისი ზომაა. NAT გეგმაზე გამავალი კავშირები (Telegram, ბირჟების API, თქვენ მიერ გამოძახებული webhook-ები) ჩვეულებრივ მუშაობს. თუ ბოტმა webhook-ები ან სხვა შემომავალი ტრაფიკი უნდა მიიღოს, აირჩიეთ Windows Small-IP ($28/თვე) საკუთარი IPv4-ით.

შემდეგი ნაბიჯები: დაიცავით RDP, ხოლო თუ ბოტის SSH-ით მართვა გირჩევნიათ, დააყენეთ OpenSSH. გადახდა ხდება USDT-ით, USDC-ით ან ETH-ით, Windows კი არის Server 2022 თქვენი საკუთარი ლიცენზიით (BYOL). ყველა გეგმა: Windows VPS.

ხდკ

რატომ არ დავტოვო სკრიპტი ჩემს RDP სესიაში?

ეს მუშაობს, სანამ რამე სესიას არ დაასრულებს: ანგარიშიდან გასვლა, განახლების შემდეგ გადატვირთვა ან ავარია. RDP ფანჯრის დახურვა (კავშირის გაწყვეტა) სესიას ცოცხლად ტოვებს, მაგრამ ანგარიშიდან გასვლა მასში ყველაფერს წყვეტს, ხოლო გადატვირთვის შემდეგ არავინაა შესული, რომ სკრიპტი თავიდან გაუშვას. დაგეგმილი ამოცანა არცერთ სესიაზე არ არის დამოკიდებული.

Task Scheduler-ს არ აქვს პარამეტრი „გადატვირთვა წარუმატებლობისას“?

აქვს, მაგრამ ჩვენს ტესტში არ დაგვეხმარა. როცა სკრიპტის პროცესი გავთიშეთ, ამოცანა „Ready“ მდგომარეობაში გადავიდა და იქ დარჩა. ეს პარამეტრი რეაგირებს, როცა ამოცანა ვერ იწყება, და არა როცა თქვენი პროგრამა მოგვიანებით კვდება. მას აბრუნებს ამ სახელმძღვანელოს განმეორებადი ტრიგერი.

შეიძლება ჩემი ბოტის ორი ასლი გაეშვას?

ამ კონფიგურაციით არა. ამოცანა თავად ბოტს უშვებს (შემფუთავი სკრიპტის გარეშე) და იყენებს MultipleInstances IgnoreNew-ს, ამიტომ ყოველწუთიანი ტრიგერი არაფერს აკეთებს, სანამ ბოტი ცოცხალია. დუბლიკატებს სწორედ შემფუთავი ციკლი ქმნის: შეწყვიტეთ შემფუთავი, მისი შვილობილი პროცესი გააგრძელებს მუშაობას, ახალი შემფუთავი კი კიდევ ერთს გაუშვებს. ზუსტად ეს ვნახეთ.

მუშაობს ეს Python-ისთვის ან Node.js-ისთვის?

კი. ინტერპრეტატორი ჩაწერეთ -Execute-ში, სკრიპტი კი -Argument-ში, სრული გზებით, მაგალითად -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py'. ინტერპრეტატორი ყველა მომხმარებლისთვის დააყენეთ, რომ SYSTEM ანგარიშმა იპოვოს.

კომენტარები

ჯერ არ არის კომენტარები. იყავით პირველი.

დატოვეთ კომენტარი

კომენტარები მოდერირდება გამოჩენამდე.