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 წამში ბოტი უკვე წერდა თავის ჟურნალში, სერვერზე მომხმარებლის სესიების გარეშე.
რამ არ იმუშავა. ორი რამ სწორად გამოიყურება, მაგრამ ასე არ არის:
- „თუ ამოცანა ჩავარდა, თავიდან გაუშვი ყოველ…“ ჩავრთეთ, პროცესი შევწყვიტეთ და ამოცანა წუთობით იდგა Ready მდგომარეობაში. ის რეაგირებს ამოცანაზე, რომელიც ვერ იწყება, და არა პროგრამაზე, რომელიც მოგვიანებით კვდება.
- შემფუთავი ციკლი (
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.
კომენტარები
ჯერ არ არის კომენტარები. იყავით პირველი.