−25%

yıllık Windows ödemesinde, 31 Ekim'e kadar. Paketlere git

EQVPS
Hemen başla

Windows Server'da bir betik 7/24 nasıl çalıştırılır: oturum kapatma, çökme ve yeniden başlatmalara dayanıklı

Bir Windows Server 2022 VPS'te bir botu veya betiği yalnızca Görev Zamanlayıcı ile gece gündüz çalıştırın: açılışta kimse oturum açmadan başlar, çöktükten sonra bir dakika içinde yeniden başlar ve asla iki kopya çalışmaz. Doğrulamak için işlemi öldürdük ve sunucuyu yeniden başlattık.

Windows VPS'te bot çalıştırmanın olağan yolu, onu bir RDP oturumunda başlatıp pencereyi kapatmaktır. Bu, bir güncelleme sunucuyu gece 3'te yeniden başlatana ve kimse onu tekrar başlatmayana kadar çalışır. Her Windows Server'da bulunan Görev Zamanlayıcı bunu ek yazılım olmadan çözer. Aşağıdaki düzen:

  • betiği açılışta, kimse oturum açmadan önce başlatır;
  • çökerse veya öldürülürse bir dakika içinde yeniden başlatır;
  • aynı anda asla iki kopya çalıştırmaz.

Üçünü de Windows Server 2022 imajımızda test ettik: işlemi öldürdük, sunucuyu yeniden başlattık ve örnekleri saydık.

Örnek betik

Botunuzun yerine geçen bir örnek: her 10 saniyede bir satır yazar, böylece canlı olup olmadığını görmek kolaydır.

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
}
'@

Görevi kaydedin

Yönetici yetkili bir PowerShell'de çalıştırın:

$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'

Her parçanın görevi:

  • -AtStartup, Windows açıldığında oturum açmış kullanıcı olmadan botu başlatır.
  • Dakikalık tekrar, görevi her dakika yeniden çalıştırır. Bot canlıysa hiçbir şey olmaz; öldüyse yeniden başlar.
  • -MultipleInstances IgnoreNew tekrarı güvenli kılar: botu zaten çalışır bulan bir çalıştırma atlanır.
  • -ExecutionTimeLimit 0, Görev Zamanlayıcı'nın botu durduracağı 72 saatlik varsayılan sınırı kapatır.
  • -User 'SYSTEM' onu parola ve oturum olmadan çalıştırır. SYSTEM sunucuda tam yetkilidir; bu şekilde yalnızca kendi kodunuzu çalıştırın.

Python için eylemi değiştirin:

$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py' -WorkingDirectory 'C:\bots'

Neleri kontrol ettik

Çökme. Botun işlemini Stop-Process -Force ile öldürdük. 46 saniye sonra dakikalık tetikleyici yenisini başlatmıştı ve tam olarak bir kopya vardı.

Yeniden başlatma. Sunucuyu yeniden başlattık ve oturum açmadık. Açılıştan 40 saniye sonra bot günlüğüne yazıyordu; sunucuda hiç kullanıcı oturumu yoktu.

Çalışmayanlar. İki şey doğru görünür ama değildir:

  1. "Görev başarısız olursa her … yeniden başlat." Açtık, işlemi öldürdük ve görev dakikalarca Hazır durumunda kaldı. Görevin başlayamamasına tepki verir, programınızın sonradan ölmesine değil.
  2. Sarmalayıcı döngü (while ($true) { & bot; sleep 5 }). Çöken botu yeniden başlatır, ama sarmalayıcının kendisi ölürse alt işlem çalışmaya devam eder ve bir sonraki başlatma ikinci bir bot açar. Sonunda iki kopyamız oldu; bir Telegram botu için bu, aynı güncellemeler için kavga eden iki işlem demektir.

Kontrol etme

Get-ScheduledTask -TaskName mybot | Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName mybot | Select-Object LastRunTime, NextRunTime
Get-Content C:\bots\heartbeat.log -Tail 5

Bakım için durdurmak isterseniz önce Disable-ScheduledTask mybot çalıştırın (yoksa dakikalık tetikleyici onu yeniden başlatır), sonra işlemi durdurun. Enable-ScheduledTask mybot her şeyi geri getirir.

Günlükler

Görev çıktıyı yakalamaz. Botun, örnekteki gibi kendi günlüğünü yazmasını sağlayın ya da çıktıyı küçük bir .cmd başlatıcısında yönlendirip -Execute'u o dosyaya yöneltin.

Hangi plan

PowerShell veya Python botu az CPU kullanır, ama Windows'un kendisi imajımızda boşta 1 ile 1,3 GB RAM kaplar. Windows-Small (4 vCPU, 4 GB RAM, 50 GB, $11/ay) bir iki bot için doğru boyuttur. NAT planında giden bağlantılar (Telegram, borsa API'leri, çağırdığınız webhook'lar) normal çalışır. Bot webhook'ları veya başka gelen trafiği alması gerekiyorsa kendi IPv4'ü olan Windows Small-IP ($28/ay) seçin.

Sonraki adımlar: RDP'yi koruyun ve botu SSH ile yönetmeyi tercih ediyorsanız OpenSSH'ı kurun. Ödeme USDT, USDC veya ETH ile yapılır ve Windows, kendi lisansınızla Server 2022'dir (BYOL). Tüm planlar: Windows VPS.

SSS

Betiği neden RDP oturumumda bırakmıyorum?

Oturumu bir şey sonlandırana kadar çalışır: oturumu kapatmak, güncelleme sonrası yeniden başlatma veya bir çökme. RDP penceresini kapatmak (bağlantıyı kesmek) oturumu canlı tutar, ama oturumu kapatmak içindeki her şeyi öldürür ve yeniden başlatmadan sonra onu tekrar başlatacak kimse oturum açmış olmaz. Zamanlanmış bir görev hiçbir oturuma bağlı değildir.

Görev Zamanlayıcı'nın 'başarısız olursa yeniden başlat' ayarı yok mu?

Var, ama testimizde işe yaramadı. Betiğin işlemini öldürdüğümüzde görev 'Hazır' durumuna geçti ve orada kaldı. Bu ayar, görev başlayamadığında devreye girer; programınız sonradan öldüğünde değil. Onu geri getiren, bu rehberdeki yinelenen tetikleyicidir.

Botumun iki kopyası çalışabilir mi?

Bu düzenle hayır. Görev botun kendisini çalıştırır (sarmalayıcı betik yok) ve MultipleInstances IgnoreNew kullanır; böylece bot yaşadığı sürece dakikalık tetikleyici hiçbir şey yapmaz. Kopyaları oluşturan tam olarak sarmalayıcı döngüdür: sarmalayıcıyı öldürürseniz alt işlemi çalışmaya devam eder ve yeni sarmalayıcı bir tane daha başlatır. Tam olarak bunu gördük.

Python veya Node.js için çalışır mı?

Evet. Yorumlayıcıyı -Execute'a, betiği -Argument'e tam yollarla yazın, örneğin -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py'. SYSTEM hesabının bulabilmesi için yorumlayıcıyı tüm kullanıcılar için kurun.

Yorumlar

Henüz yorum yok. İlk olun.

Bir yorum bırakın

Yorumlar görünmeden önce denetlenir.