Il y a deux façons pour un bot de « ne pas fonctionner » sur un serveur. L'évidente : il s'arrête à la seconde où vous fermez SSH. La sournoise : il tourne bien pendant deux jours, plante à 4 h du matin sur une erreur non gérée, et vous l'apprenez des heures plus tard quand quelqu'un demande pourquoi il est en panne. Les deux ont la même solution, et ce n'est pas « pensez à le redémarrer » — c'est confier le travail à systemd, qui garde les choses debout pour que vous n'ayez pas à le faire.
Pourquoi il meurt quand vous vous déconnectez
Si vous l'avez lancé avec python bot.py dans votre session SSH, le processus est un enfant de cette session. Fermez la session, le processus part avec elle. nohup et & masquent cela, mais ils ne vous donnent aucun redémarrage au plantage ni démarrage au boot — vous avez donc résolu le petit problème et gardé le gros.
La vraie solution : un service systemd
C'est tout le sujet. Créez /etc/systemd/system/mybot.service :
[Unit]
Description=My bot
After=network-online.target
[Service]
WorkingDirectory=/home/youruser/mybot
ExecStart=/home/youruser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
User=youruser
Environment=API_KEY=...
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
Deux lignes font le gros du travail :
Restart=always— le bot plante, systemd le ramène en 5 secondes. Cette mort de 4 h du matin devient un bégaiement de 5 secondes que personne ne remarque.enable— il redémarre après un redémarrage, tout seul. Pas de « oh, le serveur a redémarré et j'ai oublié de tout relancer ».
Quand il se comporte encore mal — lisez les journaux
Un bot qui plante en boucle ne se corrige pas en le redémarrant plus fort ; quelque chose ne va vraiment pas. systemd capture stdout/stderr, donc :
systemctl status mybot # debout ou en panne, dernier code de sortie
journalctl -u mybot -n 100 # journaux récents + l'erreur sur laquelle il est mort
journalctl -u mybot -f # suivre en direct
La cause est presque toujours juste là : une variable d'environnement manquante, une exception non gérée, un timeout d'API, un kill OOM. Corrigez ça — Restart=always est un filet de sécurité, pas un remède pour un vrai bug.
Astuce : si les journaux montrent le bot tué par manque de mémoire, vous avez dépassé la machine — consultez le guide de dimensionnement.
Quand tmux ou pm2 ont plutôt du sens
systemd n'est pas la seule réponse, juste le meilleur choix par défaut :
- tmux — parfait pour un test rapide ou pour observer un processus interactif. Lancez, détachez, rattachez plus tard. Mais il ne redémarre pas au plantage et ne survit pas à un redémarrage, ce n'est donc pas pour la production.
- pm2 — raisonnable si vous êtes déjà dans le monde Node et voulez son tableau de bord de processus. Le hic : pm2 est lui-même un processus que vous devez maintenant garder en vie (généralement… via systemd). Pour un bot, c'est une couche dont vous n'avez pas besoin.
Pour un seul bot ou agent toujours actif, systemd est la chose la plus simple qui fonctionne réellement — il est déjà sur le serveur, ne nécessite aucun outillage supplémentaire, et fait le redémarrage, le démarrage au boot et la journalisation d'emblée.
Le résumé honnête
La disponibilité ne dépend pas d'un serveur plus gros ou de plus de discipline — elle dépend de ne pas lier votre processus à votre portable. Enveloppez-le dans une unité systemd avec Restart=always et enable, et vérifiez journalctl quand quelque chose ne va pas. Faites-le une fois et votre bot reste debout que vous regardiez ou que vous dormiez. (Nouvelle machine ? Verrouillez-la d'abord — un bot 24/7 est aussi une cible 24/7.)
Besoin d'un endroit pour le faire tourner ? Une offre Nano (3 $/mois) garde un bot en vie 24/7 — systemd fait le reste.
Commentaires
Pas encore de commentaires. Soyez le premier.