Bonjour, je n’arrive pas à faire fonctionner mon script python pour redemarrer mes scripts en cas de coupure sur le serveur , j’ai configuré une tache cron qui execute le script toute les 15mins , dans le script j’utilise tmux pour garder la session ouverte pour garder mes scripts actif cest pour 2 bots telegrams, le probleme c’est quand je fais python3 redemarrage_scripts.py manuellement le script demarre bien , je pense bien utiliser tmux dans l’environnement virtuel python pour avoir les dependances nécessaires mais les bots ne fonctionne pas , je ne comprends ce qui passe dans les logs j’ai aucune erreur . Je tiens à preciser que quand je demarre les fichiers separements , ils fonctionnent bien dans le telegram , le script doit avoir un soucis mais je n’arrive pas à comprendre , pouvez vous m’éclairer ? , merci à vous
# Python 3.11.5 /
import datetime
import subprocess
import logging
# Configurez le logging pour écrire dans un fichier
logging.basicConfig(filename='scripts.log', level=logging.INFO, format='%(asctime)s - %(message)s')
# Chemin de l'environnement Python
env_path = "/web/bot-telegram/monenv/bin/activate"
logging.info("Début de l'exécution du script")
# Vérifier si tmux est en cours d'exécution
if subprocess.run(['pgrep', '-f', 'tmux'], stdout=subprocess.DEVNULL).returncode != 0:
# tmux n'est pas en cours d'exécution, le démarrer
logging.info("Démarrage de tmux")
subprocess.Popen(['tmux', 'new-session', '-d', '-s', 'my_session'])
# Vérifier si l'environnement virtuel est actif avant de l'activer
if subprocess.run(['pgrep', '-f', 'activate'], stdout=subprocess.DEVNULL).returncode != 0:
logging.info("Activation de l'environnement virtuel...")
subprocess.Popen(['tmux', 'send-keys', '-t', 'my_session', f'source {env_path}', 'C-m'])
else:
logging.info("Environnement virtuel déjà actif")
# Redémarrer les scripts
scripts = ['cellulegroup_group_order_bot.py', 'cellulegroup_countdown_bot.py']
# Vérifier si les scripts sont en cours d'exécution
for script in scripts:
if subprocess.run(['pgrep', '-f', script], stdout=subprocess.DEVNULL).returncode != 0:
# Le script n'est pas en cours d'exécution, le redémarrer
logging.info(f"Redémarrage du script {script}")
# Exécutez le script à l'intérieur de la session tmux
subprocess.Popen(['tmux', 'send-keys', '-t', 'my_session', f'python3.11 {script}', 'C-m'])
else:
logging.info(f"Le script {script} est déjà en cours d'exécution")
tu as 2 scripts Python pour 2 bots Telegram. Cela demanderait donc d’avoir 2 tâches de fond/services/daemons différents
pour qu’un script Python puisse se lancer facilement, comme n’importe-quel autre script shell, il faut :
utiliser un shebang. Dans le cas de ton virtualenv, il faut que la toute première ligne du fichier contienne cela :
#!/web/bot-telegram/monenv/bin/python
que l’utilisateur amené à lancer le fichier ai les droits de lecture et d’exécution sur ke fichier
que ce soit sous Linux ou autre système, un programme qui tourne en arrière-plan, on en fait un service / daemon. Il faudrait donc que tu regardes comment créer un service avec Systemd.
En plus de pouvoir lancer tes scripts lors du boot, cela aurait l’avantage qu’un programme/script lancé par Systemd n’a pas forcément à se préoccuper des logs vu que Systemd peut prendre la sortie du programme pour en faire un log, automatiquement.
Systemd peut aussi relancer automatiquement un programme qui se serait crashé
pour obtenir le PID d’un processus qui tourne en tâche de fond, il est préconisé d’avoir un fichier du genre /var/run/order_bot.pid , dont le contenu est le PID du programme.
Là aussi, Systemd peut aider