−25%

untuk Windows tahunan, hingga 31 Okt. Lihat paket

EQVPS
Mulai

Cara menjalankan skrip 24/7 di Windows Server: tahan logout, crash, dan restart

Jalankan bot atau skrip siang dan malam di VPS Windows Server 2022 hanya dengan Task Scheduler: mulai saat boot tanpa ada yang login, hidup lagi dalam satu menit setelah crash, dan tidak pernah berjalan dua salinan. Kami mematikan prosesnya dan me-restart server untuk memastikannya.

Cara umum menjalankan bot di VPS Windows adalah memulainya di sesi RDP lalu menutup jendelanya. Itu berjalan sampai pembaruan me-restart server pukul 3 pagi dan tidak ada yang menjalankannya lagi. Task Scheduler, yang ada di setiap Windows Server, menyelesaikan ini tanpa perangkat lunak tambahan. Pengaturan di bawah ini:

  • menjalankan skrip saat boot, sebelum ada yang login;
  • menjalankannya lagi dalam satu menit jika crash atau dimatikan;
  • tidak pernah menjalankan dua salinan sekaligus.

Ketiganya kami uji di image Windows Server 2022 kami: mematikan proses, me-restart server, dan menghitung instansnya.

Skrip contoh

Pengganti bot Anda: menulis satu baris setiap 10 detik, jadi mudah melihat apakah ia masih hidup.

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

Daftarkan tugas

Jalankan di PowerShell dengan hak administrator:

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

Fungsi setiap bagian:

  • -AtStartup menjalankan bot saat Windows menyala, tanpa pengguna yang login.
  • Pengulangan setiap menit menjalankan tugas lagi setiap menit. Jika bot hidup, tidak terjadi apa-apa; jika mati, ia mulai lagi.
  • -MultipleInstances IgnoreNew membuat pengulangan aman: eksekusi yang mendapati bot sudah berjalan akan dilewati.
  • -ExecutionTimeLimit 0 mematikan batas bawaan 72 jam, yang setelahnya Task Scheduler akan menghentikan bot.
  • -User 'SYSTEM' menjalankannya tanpa kata sandi dan tanpa sesi. SYSTEM punya hak penuh di server, jadi jalankan hanya kode Anda sendiri dengan cara ini.

Untuk Python, ganti aksinya:

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

Yang kami periksa

Crash. Kami mematikan proses bot dengan Stop-Process -Force. 46 detik kemudian pemicu per menit sudah menjalankan yang baru, dan hanya ada tepat satu salinan.

Restart. Kami me-restart server dan tidak login. 40 detik setelah boot, bot sudah menulis ke log-nya, tanpa sesi pengguna di server.

Yang tidak berhasil. Dua hal tampak benar padahal tidak:

  1. "Jika tugas gagal, mulai ulang setiap…" Kami mengaktifkannya, mematikan proses, dan tugas berdiam beberapa menit dalam status Ready. Opsi ini bereaksi pada tugas yang gagal dimulai, bukan pada program yang mati belakangan.
  2. Loop pembungkus (while ($true) { & bot; sleep 5 }). Loop ini menjalankan ulang bot yang crash, tetapi jika pembungkusnya sendiri mati, anaknya terus berjalan dan eksekusi berikutnya menjalankan bot kedua. Kami berakhir dengan dua salinan, yang untuk bot Telegram berarti dua proses yang berebut pembaruan yang sama.

Cara memeriksa

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

Untuk menghentikannya saat pemeliharaan, jalankan dulu Disable-ScheduledTask mybot (jika tidak, pemicu per menit akan menjalankannya lagi), lalu hentikan prosesnya. Enable-ScheduledTask mybot mengembalikannya.

Log

Tugas tidak menangkap output. Biarkan bot menulis log-nya sendiri, seperti contoh, atau alihkan output di peluncur .cmd kecil dan arahkan -Execute ke file itu.

Paket yang mana

Bot PowerShell atau Python memakai sedikit CPU, tetapi Windows sendiri memakai 1 hingga 1,3 GB RAM saat diam di image kami. Windows-Small (4 vCPU, RAM 4 GB, 50 GB, $11/bln) adalah ukuran yang pas untuk satu atau dua bot. Di paket NAT, koneksi keluar (Telegram, API bursa, webhook yang Anda panggil) berjalan seperti biasa. Jika bot perlu menerima webhook atau lalu lintas masuk lain, pilih Windows Small-IP ($28/bln) dengan IPv4 sendiri.

Langkah berikutnya: amankan RDP dan, jika Anda lebih suka mengelola bot lewat SSH, pasang OpenSSH. Pembayaran dengan USDT, USDC, atau ETH, dan Windows-nya adalah Server 2022 dengan lisensi Anda sendiri (BYOL). Semua paket: Windows VPS.

FAQ

Kenapa tidak membiarkan skrip berjalan di sesi RDP saya saja?

Itu berjalan sampai ada yang mengakhiri sesi: logout, restart setelah pembaruan, atau crash. Menutup jendela RDP (memutus koneksi) membuat sesi tetap hidup, tetapi logout mematikan semua yang ada di dalamnya, dan setelah restart tidak ada yang login untuk menjalankannya lagi. Tugas terjadwal tidak bergantung pada sesi apa pun.

Bukankah Task Scheduler punya opsi 'mulai ulang jika gagal'?

Ada, tetapi dalam pengujian kami tidak membantu. Saat proses skrip kami matikan, tugas berpindah ke status 'Ready' dan diam di sana. Opsi itu bereaksi saat tugas gagal dimulai, bukan saat program Anda mati belakangan. Yang menghidupkannya kembali adalah pemicu berulang dalam panduan ini.

Bisakah dua salinan bot saya berjalan bersamaan?

Tidak dengan pengaturan ini. Tugas menjalankan bot itu sendiri (tanpa skrip pembungkus) dan memakai MultipleInstances IgnoreNew, jadi pemicu per menit tidak melakukan apa pun selama bot hidup. Yang justru membuat duplikat adalah loop pembungkus: matikan pembungkusnya, proses anaknya terus berjalan, dan pembungkus baru menjalankan satu lagi. Itulah yang kami lihat.

Apakah ini berlaku untuk Python atau Node.js?

Ya. Taruh interpreter di -Execute dan skrip di -Argument, dengan jalur lengkap, misalnya -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py'. Pasang interpreter untuk semua pengguna agar akun SYSTEM bisa menemukannya.

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.