−25%

Windows รายปี ถึง 31 ต.ค. ดูแพ็กเกจ

EQVPS
เริ่มต้นใช้งาน

วิธีรันสคริปต์ 24/7 บน Windows Server: ไม่หยุดเมื่อออกจากระบบ ล่ม หรือรีสตาร์ต

ให้บอตหรือสคริปต์ทำงานทั้งวันทั้งคืนบน VPS Windows Server 2022 ด้วย Task Scheduler อย่างเดียว: เริ่มตอนบูตโดยไม่ต้องมีใครล็อกอิน กลับมาทำงานภายในหนึ่งนาทีหลังล่ม และไม่รันซ้ำสองชุด เราสั่งปิดโปรเซสและรีสตาร์ตเซิร์ฟเวอร์เพื่อตรวจสอบแล้ว

วิธีทั่วไปในการรันบอตบน 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 อยู่แล้ว โดยไม่มีเซสชันผู้ใช้บนเซิร์ฟเวอร์

สิ่งที่ไม่ได้ผล มีสองอย่างที่ดูเหมือนถูกแต่ไม่ใช่:

  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 จะกลับมาทำงานตามเดิม

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

คำถามที่พบบ่อย

ทำไมไม่ปล่อยสคริปต์ไว้ในเซสชัน 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 หาเจอ

ความคิดเห็น

ยังไม่มีความคิดเห็น เป็นคนแรกสิ

แสดงความคิดเห็น

ความคิดเห็นจะถูกตรวจสอบก่อนแสดง