−25%

sur Windows en paiement annuel, jusqu'au 31/10. Voir les offres

EQVPS
Commencer

Exécuter un script 24/7 sur Windows Server : il survit à la déconnexion, aux plantages et aux redémarrages

Faire tourner un bot ou un script jour et nuit sur un VPS Windows Server 2022 avec le seul Planificateur de tâches : démarrage au boot sans personne de connecté, relance en moins d'une minute après un plantage, jamais deux copies. Nous avons tué le processus et redémarré pour vérifier.

La façon habituelle de faire tourner un bot sur un VPS Windows, c'est de le lancer dans une session RDP et de fermer la fenêtre. Cela marche jusqu'à ce qu'une mise à jour redémarre le serveur à 3 h du matin et que personne ne le relance. Le Planificateur de tâches, présent sur tout Windows Server, règle cela sans logiciel supplémentaire. La configuration ci-dessous :

  • lance le script au démarrage, avant que quiconque se connecte ;
  • le relance en moins d'une minute s'il plante ou est tué ;
  • ne lance jamais deux copies en même temps.

Nous avons testé les trois sur notre image Windows Server 2022 : processus tué, serveur redémarré, instances comptées.

Le script d'exemple

Un remplaçant de votre bot : il écrit une ligne toutes les 10 secondes, on voit donc facilement s'il est vivant.

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

Enregistrer la tâche

Lancez dans un PowerShell élevé :

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

Ce que fait chaque élément :

  • -AtStartup lance le bot au démarrage de Windows, sans utilisateur connecté.
  • La répétition chaque minute relance la tâche toutes les minutes. Si le bot est vivant, rien ne se passe ; s'il est mort, il redémarre.
  • -MultipleInstances IgnoreNew rend la répétition sûre : une exécution qui trouve le bot déjà en marche est ignorée.
  • -ExecutionTimeLimit 0 supprime la limite par défaut de 72 heures, après laquelle le Planificateur arrêterait le bot.
  • -User 'SYSTEM' l'exécute sans mot de passe ni session. SYSTEM a tous les droits sur le serveur : n'exécutez ainsi que votre propre code.

Pour Python, remplacez l'action :

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

Ce que nous avons vérifié

Plantage. Nous avons tué le processus du bot avec Stop-Process -Force. 46 secondes plus tard, le déclencheur de chaque minute en avait lancé un nouveau, et il y avait exactement une copie.

Redémarrage. Nous avons redémarré le serveur sans nous connecter. 40 secondes après le démarrage, le bot écrivait dans son journal, sans aucune session utilisateur sur le serveur.

Ce qui n'a pas marché. Deux choses semblent justes et ne le sont pas :

  1. « Si la tâche échoue, la redémarrer toutes les… » Nous l'avons activée, tué le processus, et la tâche est restée plusieurs minutes à l'état Prêt. L'option réagit à un échec de démarrage de la tâche, pas à la mort ultérieure de votre programme.
  2. Une boucle enveloppe (while ($true) { & bot; sleep 5 }). Elle relance un bot planté, mais si l'enveloppe elle-même meurt, son enfant continue de tourner, et le démarrage suivant lance un second bot. Nous nous sommes retrouvés avec deux copies, ce qui pour un bot Telegram veut dire deux processus qui se disputent les mêmes mises à jour.

Le surveiller

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

Pour l'arrêter pendant une maintenance, faites d'abord Disable-ScheduledTask mybot (sinon le déclencheur de chaque minute le relance), puis arrêtez le processus. Enable-ScheduledTask mybot le remet en route.

Journaux

La tâche ne capture pas la sortie. Faites écrire au bot son propre journal, comme dans l'exemple, ou redirigez la sortie dans un petit lanceur .cmd et pointez -Execute vers ce fichier.

Quelle offre

Un bot PowerShell ou Python consomme peu de CPU, mais Windows lui-même occupe de 1 à 1,3 Go de RAM au repos sur notre image. Windows-Small (4 vCPU, 4 Go de RAM, 50 Go, $11/mois) est la bonne taille pour un ou deux bots. Sur une offre NAT, les connexions sortantes (Telegram, API d'exchanges, webhooks que vous appelez) fonctionnent normalement. Si le bot doit recevoir des webhooks ou d'autres flux entrants, prenez Windows Small-IP ($28/mois) avec sa propre IPv4.

Ensuite : sécurisez RDP et, si vous préférez gérer le bot par SSH, installez OpenSSH. Le paiement se fait en USDT, USDC ou ETH, et Windows est Server 2022 avec votre propre licence (BYOL). Toutes les offres : Windows VPS.

FAQ

Pourquoi ne pas laisser tourner le script dans ma session RDP ?

Cela marche jusqu'à ce que quelque chose termine la session : une déconnexion de compte, un redémarrage après mises à jour ou un plantage. Fermer la fenêtre RDP (se déconnecter) garde la session, mais fermer la session tue tout ce qu'elle contient, et après un redémarrage personne n'est connecté pour relancer le script. Une tâche planifiée ne dépend d'aucune session.

Le Planificateur n'a-t-il pas l'option « redémarrer en cas d'échec » ?

Si, mais elle n'a pas aidé dans notre test. Quand nous avons tué le processus du script, la tâche est passée à « Prêt » et y est restée. Cette option réagit quand la tâche n'arrive pas à démarrer, pas quand votre programme meurt plus tard. Ce qui la relance, c'est le déclencheur répété de ce guide.

Deux copies de mon bot peuvent-elles tourner ?

Pas avec cette configuration. La tâche lance le bot lui-même (sans script enveloppe) et utilise MultipleInstances IgnoreNew : le déclencheur de chaque minute ne fait rien tant que le bot vit. Ce qui crée des doublons, c'est une boucle enveloppe : tuez l'enveloppe, son processus enfant continue, et une nouvelle enveloppe en lance un autre. C'est exactement ce que nous avons vu.

Ça marche avec Python ou Node.js ?

Oui. Mettez l'interpréteur dans -Execute et le script dans -Argument, avec des chemins complets, par exemple -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py'. Installez l'interpréteur pour tous les utilisateurs afin que le compte SYSTEM le trouve.

Commentaires

Pas encore de commentaires. Soyez le premier.

Laisser un commentaire

Les commentaires sont modérés avant leur publication.