הדרך הרגילה להריץ בוט ב-VPS עם Windows היא להפעיל אותו בסשן RDP ולסגור את החלון. זה עובד עד שעדכון מאתחל את השרת בשלוש לפנות בוקר ואף אחד לא מפעיל אותו שוב. 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 }). היא מפעילה מחדש בוט שקרס, אבל אם העוטף עצמו מת, הבן ממשיך לרוץ וההפעלה הבאה מעלה בוט שני. נשארנו עם שני עותקים, ובבוט טלגרם זה אומר שני תהליכים שרבים על אותם עדכונים.
איך בודקים
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 צורך מעט מעבד, אבל Windows עצמו תופס באימג' שלנו בין 1 ל-1.3 GB זיכרון במנוחה. Windows-Small (4 vCPU, 4 GB זיכרון, 50 GB, $11 לחודש) הוא הגודל המתאים לבוט אחד או שניים. בתוכנית NAT חיבורים יוצאים (טלגרם, ממשקי API של בורסות, webhooks שאתם קוראים) עובדים כרגיל. אם הבוט צריך לקבל webhooks או תעבורה נכנסת אחרת, בחרו Windows Small-IP ($28 לחודש) עם IPv4 משלה.
הצעדים הבאים: אבטחו את RDP, ואם אתם מעדיפים לנהל את הבוט דרך SSH, התקינו OpenSSH. התשלום ב-USDT, USDC או ETH, ו-Windows הוא Server 2022 עם הרישיון שלכם (BYOL). כל התוכניות: Windows VPS.
תגובות
אין עדיין תגובות. היו הראשונים.