−25%

Windows-এর বার্ষিক পেমেন্টে, ৩১ অক্টোবর পর্যন্ত। প্ল্যান দেখুন

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।

FAQ

স্ক্রিপ্টটা নিজের 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 অ্যাকাউন্ট সেটি খুঁজে পায়।

মন্তব্য

এখনো কোনো মন্তব্য নেই। প্রথম হোন।

একটি মন্তব্য দিন

মন্তব্য প্রকাশের আগে মডারেট করা হয়।