วิธีทั่วไปในการรันบอตบน Windows VPS คือเปิดในเซสชัน 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 วินาทีหลังบูต บอตเขียน log อยู่แล้ว โดยไม่มีเซสชันผู้ใช้บนเซิร์ฟเวอร์
สิ่งที่ไม่ได้ผล มีสองอย่างที่ดูเหมือนถูกแต่ไม่ใช่:
- "ถ้างานล้มเหลว ให้เริ่มใหม่ทุก…" เราเปิดตัวเลือกนี้ ปิดโปรเซส และงานค้างอยู่ในสถานะ 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 จะกลับมาทำงานตามเดิม
Log
งานไม่เก็บเอาต์พุตไว้ ให้บอตเขียน log ของตัวเองเหมือนตัวอย่าง หรือเปลี่ยนเส้นทางเอาต์พุตในไฟล์ .cmd เล็ก ๆ แล้วชี้ -Execute ไปที่ไฟล์นั้น
เลือกแพ็กเกจไหน
บอต PowerShell หรือ Python ใช้ CPU น้อย แต่ตัว Windows เองใช้ RAM ตั้งแต่ 1 ถึง 1.3 GB ตอนว่างบนอิมเมจของเรา Windows-Small (4 vCPU, RAM 4 GB, 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
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ