−25%

Windows के सालाना भुगतान पर, 31 अक्टूबर तक। प्लान देखें

EQVPS
शुरू करें

Windows Server पर स्क्रिप्ट 24/7 कैसे चलाएँ: लॉगऑफ़, क्रैश और रीस्टार्ट के बाद भी

सिर्फ़ Task Scheduler से Windows Server 2022 VPS पर बॉट या स्क्रिप्ट दिन-रात चलाएँ: बिना किसी के लॉगिन किए बूट पर शुरू, क्रैश के बाद एक मिनट में वापस, और कभी दो प्रतियाँ नहीं। हमने प्रोसेस बंद करके और सर्वर रीस्टार्ट करके इसकी जाँच की।

Windows VPS पर बॉट चलाने का आम तरीका है उसे RDP सत्र में शुरू करके विंडो बंद कर देना। यह तब तक चलता है जब तक कोई अपडेट रात 3 बजे सर्वर रीस्टार्ट न करे और कोई उसे फिर शुरू न करे। हर Windows Server में मौजूद Task Scheduler इसे बिना अतिरिक्त सॉफ़्टवेयर के हल करता है। नीचे का सेटअप:

  • स्क्रिप्ट को बूट पर, किसी के लॉगिन करने से पहले शुरू करता है;
  • क्रैश होने या बंद किए जाने पर उसे एक मिनट के अंदर फिर शुरू करता है;
  • कभी दो प्रतियाँ एक साथ नहीं चलाता।

तीनों बातें हमने अपनी 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, आपके बुलाए वेबहुक) सामान्य रूप से चलते हैं। अगर बॉट को वेबहुक या दूसरा इनबाउंड ट्रैफ़िक लेना है, तो अपने IPv4 वाला Windows Small-IP ($28/महीना) चुनें।

आगे: 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 खाता उसे ढूँढ सके।

टिप्पणियाँ

अभी तक कोई टिप्पणी नहीं। पहले बनें।

एक टिप्पणी छोड़ें

टिप्पणियाँ दिखने से पहले मॉडरेट की जाती हैं।